【Android】View移动时RawX()为什么要重新设置初始坐标/getX()和getRawX()的区别

今天在做拖动View使其跟随手指移动的Demo时,用了getX()和getRawX()两种方法来实现,

getX()的方法实现:

public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        Log.e(TAG, "onTouchEvent: " + x +"---" + y);
        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的基础上加上偏移量
                // view会调用layout方法,layout中会调用onLayout方法,正常情况下我们重写onLayout就可以了
                layout(getLeft() + offsetX,
                        getTop() + offsetY,
                        getRight() + offsetX,
                        getBottom() + offsetY);
//                offsetLeftAndRight(offsetX);
//                offsetTopAndBottom(offsetY);
                break;
        }
        return true;
    }
getRawX()的方法实现:

// 绝对坐标方式

    @Override
    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;
    }
我们可以看到两者间的区别:getRawX()的方法要在ACTION_MOVE的最后重新设置初始坐标。

原因:

getX()获取的是当前相对于触摸的View的坐标,在ACTION_MOVE中将View偏移后,下一次触发onTouchEvent的时候,event.getX()已经自动随着View的更改而调整了位置,所以无需手动重新设置初始坐标。

而getRawX()获取的是相对于整个屏幕的绝对坐标ACTION_MOVE中将View偏移后,下一次触发onTouchEvent的时候,event.getRawX()并没有获取的依然是屏幕绝对坐标,如果这时不手动重新设置坐标,那么偏移量会大大增加。

自己慢慢体会。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值