0
点赞
收藏
分享

微信扫一扫

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

small_Sun 2022-09-27 阅读 219


今天在做拖动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()并没有获取的依然是屏幕绝对坐标,如果这时不手动重新设置坐标,那么偏移量会大大增加。

自己慢慢体会。

举报

相关推荐

为什么要初始化CSS的样式?

0 条评论