View的滑动方向和滑动距离判断(通过android8.1源码进行解析)

滑动的距离

怎么计算滑动的距离和方向?

View的滑动方向和滑动距离判断(通过android8.1源码进行解析)_第1张图片
有人会问这边简单的问题还有问,如上图,如果手指重0滑动到100相,滑动了100的距离,如果重100滑动到200,也滑动了100的距离,于是推理出公式,当前手指所在的的位置 - 手指开始时的位置 = 手指滑动的距离
于是得出结论:当差值为正数时,表示右滑动,当差值为负数时,表示左滑动。
但是我想说,在android体系中是有一点点区别的。
我们来看一看RecyclerView的源码(android8.1):

 switch (action) {
        case MotionEvent.ACTION_DOWN: {// down记录手指的位置
            ... //省略
            mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f);
            mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f);
            ... //省略
        } break;

        case MotionEvent.ACTION_MOVE: { 
            ... //省略
            // 获取手指当前所在的位置
            final int x = (int) (e.getX(index) + 0.5f);
            final int y = (int) (e.getY(index) + 0.5f);
            // 计算距离
            int dx = mLastTouchX - x;
            int dy = mLastTouchY - y;
            ... //省略
         } break;
   }

不知道大家有没有注意到,在android源码中,计算距离的方法是手指放下时的坐标减去当前手指的坐标,所以得到一个结论,
如果 dx 为正数代表向左滑动,dx 为负数代表向右滑动。
如果 dy 为正数代表向上滑动,dy 为负数代表向下滑动。
所以这一点要特别注意,我看见网上很多判断方向的代码都是用的第一种方式去实现,虽然思路和结果是正确的,但是毕竟和源码有一定的区别,在原则上上尽量和系统特性保持一致,可以少遇见一些坑。

你可能感兴趣的:(android)