在写五子棋的棋盘,自定义view的时候,onTouchEvent()方法中一直在纠结怎么处理点击事件
1.我需要捕捉用户点击棋盘的位置,从而进行落子操作
2.按照正常的操作习惯,如果点击了屏幕,但是用户后悔了,就会把手指往边上滑动,从而表示取消此次操作
完成这个效果的思路是:
1.记录用户手指点击屏幕时的坐标
2.记录用户手指离开屏幕时的坐标
3.计算up-down的差值,这里可以自定义一个差值限制,比如10,如果差值的绝对值(用户手指不一定是左滑还是右滑,所以是绝对值)大于10,则表示view对此次手势不感兴趣
思路很简单,实现也很简单,虽然说简单,虽然确实也很简单,但也消磨了我不少时间琢磨。
贴一下代码
private boolean isMove = false;//用户手指是否滑动
private int down_x;//手指落下时的x坐标
private int down_y;//手指落下时的y坐标
--这里之所以要把这三个变量声明在函数外,是因为每次手势变动(落下,滑动,抬起)都会调用onTouchEvent,如果定义在函数内,则每次调用都会被初始化,值会被改变
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {//手指落下的时候记录下坐标
down_x = (int) event.getX();
down_y = (int) event.getY();
return true;
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {//手指移动的时候记录移动的坐标
if (Math.abs(event.getX() - down_x) > 10 || Math.abs(event.getY() - down_y) > 10) {//如果差值的绝对值大于设定阀值,则表示滑动了手指,对手势不感兴趣
isMove = true;//滑动了手指
}
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {//当用户手指离开屏幕的时候
if (isMove) {//如果移动了,将isMove重新设置为false,重新等待下一次手势操作
isMove = false;
return false;
}
…………
…………
…………//可以在此进行相应逻辑操作
return true;
}
return true;
}