ljuns
ljuns
采纳率0%
2017-01-04 05: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条回答

  • u013147734 渐行渐远是否还有一种坚持留在心间 4年前

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

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

    点赞 评论 复制链接分享
  • qq_36208852 过去的blankii 4年前

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

    点赞 评论 复制链接分享

相关推荐