您的位置:首页 > 移动开发 > Android开发

【Android】【自定义View】MotionEvent getX()和getRawX()的区别

2016-12-27 11:32 441 查看
下面是View跟随手指移动的案例,使用 getaowX和getX 两种获取坐标的方式

先是 getRawX()的方式

@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getRawX();
float y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) (x - lastX);
int dy = (int) (y - lastY);
layout(
getLeft() + dx,
getTop() + dy,
getRight() + dx,
getBottom() + dy
);
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}


再是getX()的方式

@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) (x - lastX);
int dy = (int) (y - lastY);
layout(
getLeft() + dx,
getTop() + dy,
getRight() + dx,
getBottom() + dy
);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}


发现了 getRawX的方式比getX的方式,在Move中多了一步赋值,即:

lastX = x;

lastY = y;

可是完成的效果确实一样,这是为什么呢?

其实是这样的

getRawX:触摸点相对于屏幕的坐标

getX: 触摸点相对于按钮的坐标



可以这么认为:getRawX获取的是绝对坐标,而getX获取的是相对坐标

在getX()的做法里面,

layout(

getLeft() + dx,

getTop() + dy,

getRight() + dx,

getBottom() + dy

);

之后,view发生了位移,下一次getX()的值被修正了,所以无需再次赋值.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息