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