2 ljuns ljuns 于 2017.01.04 13:08 提问

android view 的滑动疑惑
 public class DragView extends View {

    private int lastX;
    private int lastY;

    public DragView(Context context) {
        super(context);
        ininView();
    }

    public DragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        ininView();
    }

    public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        ininView();
    }

    private void ininView() {
        // 给View设置背景颜色,便于观察
        setBackgroundColor(Color.BLUE);
    }

    @Override
    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;

                // 在当前坐标增加偏移量
                layout(getLeft() + offSetX,
                        getTop() + offSetY,
                        getRight() + offSetX,
                        getBottom() + offSetY);
               break;
        }
        return true;
    }
}

代码如上,问题:移动 view 的时候为什么会有偏移量?
我的理解: 既然 getX() 和 getY() 获取的是相对于 view 自己左上角的坐标,如果我手指放在 view 的中间拖动 view,不管 view 的位置在哪里 getX() 和 getY() 获取的值是不变的,那么偏移量应该是0才对

2个回答

qq_36208852
qq_36208852   2017.01.04 15:22

拖动view,偏移量就已经有了,只是你没发觉把

u013147734
u013147734   2017.01.04 15:23

getX()是相对自己的坐标,而layout却是相对父控件的坐标...

如果偏移量是0,那么你根本检测不到MotionEvent.ACTION_MOVE方法,当然是系统先收到MOVE事件,你再调用layout.
当然我觉得你这么调用layout会有问题的,依据了两个不同相对物,如果你想通过自己的event事件移动自己,还是使用event.getRawX好吧

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!