控件随手指移动
- 重写onTouch
方法1:
class btnMove1 implements OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: //当手指按下时记录开始位置
startX1 = event.getRawX();
startY1 = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//计算控件的位置
v.setX(v.getX()+event.getRawX()-startX1);
v.setY(v.getY()+event.getRawY()-startY1);
startX1 = event.getRawX();
startY1 = event.getRawY();
break;
case MotionEvent.ACTION_UP:
endX1 = event.getRawX();
endY1 = event.getRawY();
break;
default:
break;
}
return true;
}
}
方法2
class btnMove2 implements OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX2 = (int)event.getRawX();
startY2 = (int)event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int x = (int)event.getRawX(); //屏幕边界到手指处的x
int y = (int)event.getRawY(); //屏幕边界到手指处的y
int mx =(int)x-startX2; //控件移动了多少x
int my = (int)y-startY2;//移动了多少y
int l = v.getLeft(); //控件左边界到屏幕的宽度
int r = v.getRight();
int t = v.getTop(); //控件上边界到屏幕边界的高度
int b = v.getBottom();
v.layout(l+mx, t+my, r+mx, b+my); //设置控件移动到的位置
startX2 = (int)event.getRawX();
startY2 = (int)event.getRawY();
break;
case MotionEvent.ACTION_UP:
endX2 = (int)event.getRawX();
endY2 = (int)event.getRawY();
break;
default:
break;
}
return true;
}
}
以上代码就实现的控件随手指移动,在设置控件的OnTouchListener事件就可以了
moveBtn1.setOnTouchListener(new btnMove1());
moveBtn3.setOnTouchListener(new btnMove2());
解决onTouch事件和onClick事件的冲突
但是这样做我们会发现当我们想同时设置onClick 和onTouch事件时 onClick事件会无效或同时触发。这时只需要什么在onTouch 中记录开始位置和结束位置在进行比较判断返回true还false就可以了
class btnMove1 implements OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: //当手指按下时记录开始位置
startX1 = event.getRawX();
startY1 = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//计算控制的位置
v.setX(v.getX()+event.getRawX()-startX1);
v.setY(v.getY()+event.getRawY()-startY1);
startX1 = event.getRawX();
startY1 = event.getRawY();
break;
case MotionEvent.ACTION_UP:
endX1 = event.getRawX();//记录结束位置
endY1 = event.getRawY();
break;
default:
break;
}
if (endX1-startX1 <5 && endY1-startY1 <5) {
return false;//如果结束位置-开始位置小于5就返回false 。返回false代表可以触发点击事件
}else{
return true; // 否则返回true 。表示不触发点击事件
}
}
}
一键还原位置
当我们移动了位置想要快速还原位置时可以调用bringToFront()方法
v.bringToFront();
参考:
参考