自定义控件只捕获手势点击事件,如果发生了滑动手势则放弃捕获

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lift_class/article/details/51517543

在写五子棋的棋盘,自定义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;
    }


阅读更多

没有更多推荐了,返回首页