这篇文章主要为大家详细介绍了Android实现View的拖拽,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android实现View拖拽的具体代码,供大家参考,具体内容如下
前言
实现View的拖拽,其实原理很简单。无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置。
首先是获取手机的位移信息就可以根据需求不同分为两种
- 拖拽view本身,view实现移动。则设置view的setOnTouchListener。
- 在activity中随意滑动,view都会反应出动作。则重写activity onTouchEvent方法。
而移动的方法嘛,也有几种
- 给view设置补间动画,动画时间为0.(不推荐,因为移动的只是view的影子,本地还在原地)
- 更改view 的margin。(不推荐,会影响viewgroup的布局排布)
- 根据属性动画原理,更改setTranslationX和setTranslationY.(推荐此方法,不会影响原理的布局排布)
代码
public class ViewTestActivity extends AppCompatActivity {
private static final String TAG = "ViewTestActivity";
private TextView mTv1,mTv2;
private double lastx,lastY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_test);
mTv1= (TextView) findViewById(R.id.tv01);
mTv1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
double x=event.getRawX();
double y=event.getRawY();
Log.d(TAG, "onTouch: "+event.getAction());
if (event.getAction()==MotionEvent.ACTION_DOWN){
lastx=x;
lastY=y;
}else if (event.getAction()==MotionEvent.ACTION_MOVE){
double dx=x-lastx;
double dy=y-lastY;
Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
// startAnimation(dx,dy);
// moveMethod1(dx, dy);
moveMethod2(dx, dy);
lastx=x;
lastY=y;
}
return true;
}
});
}
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// double x=event.getRawX();
// double y=event.getRawY();
// Log.d(TAG, "onTouch: "+event.getAction());
// if (event.getAction()==MotionEvent.ACTION_DOWN){
// lastx=x;
// lastY=y;
// }else if (event.getAction()==MotionEvent.ACTION_MOVE){
// double dx=x-lastx;
// double dy=y-lastY;
// Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
//// startAnimation(dx,dy);
//
// // moveMethod1(dx, dy);
// moveMethod2(dx, dy);
//
// lastx=x;
// lastY=y;
// }
// return true;
// }
//根据属性动画的原理
private void moveMethod2(double dx, double dy) {
mTv1.setTranslationX((float) (mTv1.getTranslationX()+dx));
mTv1.setTranslationY((float) (mTv1.getTranslationY()+dy));
}
//根据margin 原理
private void moveMethod1(double dx, double dy) {
ViewGroup.MarginLayoutParams marginLayoutParams= (ViewGroup.MarginLayoutParams) mTv1.getLayoutParams();
marginLayoutParams.leftMargin+=dx;
marginLayoutParams.topMargin+=dy;
mTv1.setLayoutParams(marginLayoutParams);
}
private void startAnimation(double dx, double dy) {
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(mTv1,"translationX", (float) (mTv1.getTranslationX()+dx)).setDuration(3000);
objectAnimator.start();
ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(mTv1,"translationY", (float) (mTv1.getTranslationY()+dy)).setDuration(3000);
objectAnimator2.start();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:Android实现View的拖拽
猜你喜欢
- 详解flutter engine 那些没被释放的东西 2022-12-04
- Android studio实现动态背景页面 2023-05-23
- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- Android实现监听音量的变化 2023-03-30
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
- Android实现轮询的三种方式 2023-02-17
- Flutter实现底部和顶部导航栏 2022-08-31
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14
- iOS 对当前webView进行截屏的方法 2023-03-01
