视图坐标系和绝对坐标系偏移量来实现滑动

在 Android群英传上面看到使用视图坐标系和绝对坐标系偏移量来实现滑动的方法,不解为什么在绝对值坐标系中,需要在在执行 ACTION_MOVE 逻辑之后重新初始化坐标。


采用视图坐标系:

    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 记录触摸点坐标
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                // 计算偏移量
                int offsetX = x - lastX;
                int offsetY = y - lastY;
                // 在当前left、top、right、bottom的基础上加上偏移量
                layout(getLeft() + offsetX,
                        getTop() + offsetY,
                        getRight() + offsetX,
                        getBottom() + offsetY);
//                        offsetLeftAndRight(offsetX);
//                        offsetTopAndBottom(offsetY);
                break;
        }
        return true;
    }

采用绝对值坐标系:

    public boolean onTouchEvent(MotionEvent event) {
        int rawX = (int) (event.getRawX());
        int rawY = (int) (event.getRawY());
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 记录触摸点坐标
                lastX = rawX;
                lastY = rawY;
                break;
            case MotionEvent.ACTION_MOVE:
                // 计算偏移量
                int offsetX = rawX - lastX;
                int offsetY = rawY - lastY;
                // 在当前left、top、right、bottom的基础上加上偏移量
                layout(getLeft() + offsetX,
                        getTop() + offsetY,
                        getRight() + offsetX,
                        getBottom() + offsetY);
                // 重新设置初始坐标
                lastX = rawX;
                lastY = rawY;
                break;
        }
        return true;
    }

书本上面一笔带过“这样才能准确的获取偏移量”????你丫逗我 这里写图片描述

按步骤来
0. 去 Android Developers 上找……好吧,不知道怎么找
1. 在网上搜这个问题,结果清一色的题目,都是书本上面的原文……
2. 也就靠自己了


如果不重新设置初始坐标,在手机上面运行时可以很明显的感觉到选框在飘,感觉是坐标参考量的原因。
1. 在视图参考系中,比较的是焦点和控件的距离,而且每次 ACTION_MOVE的layout() 方法执行之后, 焦点和控件之间的距离依旧保存不变,所以在每次计算偏移量时 ,只需要比较移动距离就行。
2. 在绝对值参考系中,比较是焦点和整个屏幕边界的距离,而每次移动之后,焦点和屏幕边界之间的距离,也就是我们的参考量发生了变化。这就是我们需要重新设置初始坐标的原因


视图参考系(移动前):

视图坐标系和绝对坐标系偏移量来实现滑动_第1张图片

视图参考系(移动后):

视图坐标系和绝对坐标系偏移量来实现滑动_第2张图片

可以看到参考量是不变的


绝对值参考系(移动前):

视图坐标系和绝对坐标系偏移量来实现滑动_第3张图片

绝对值参考系(移动后):

视图坐标系和绝对坐标系偏移量来实现滑动_第4张图片

可以很明显的看出,参考量发生了改变,所以需要重新设置初始值

你可能感兴趣的:(Android)