您的位置:首页 > 其它

getX和getRawX

2016-03-21 13:30 225 查看
今天在做一个关于拖动button的小demo,看到里面有getX和getRawX。就写了个测试来看看两者有什么区别。

布局文件就一个button

代码如下:

button.setOnTouchListener(new OnTouchListener() {
int lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;

int l = v.getLeft() + dx;
int b = v.getBottom() + dy;
int r = v.getRight() + dx;
int t = v.getTop() + dy;

if (l < 0) {
l = 0;
r = l + v.getWidth();
}
if (t < 0) {
t = 0;
b = t + v.getHeight();
}
if (r > width) {
r = width;
l = r - v.getWidth();
}
if (b > height) {
b = height;
t = b - v.getHeight();
}

v.layout(l, t, r, b);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
v.postInvalidate();
break;
case MotionEvent.ACTION_UP:
// Log.i("getRawX", (int)event.getRawX()+"");
// Log.i("getRawY", (int)event.getRawY()+"");
// Log.i("getX", (int)event.getX()+"");
// Log.i("getY", (int)event.getY()+"");
// Log.i("getWidth", v.getWidth()+"");
// Log.i("getHeight", v.getHeight()+"");
break;
}
return false;
}
});


getX()是表示组件相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)

如果你的某个Activity中实现OnTouchListener接口,需要重写onTouch(View view,MotionEvent event) 这个方法,getRawX()和getRawY()获得的是相对屏幕的位置,getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和宽度)。



当然,如果重写Activity的onTouchEvent(MotionEvent event) ,这个时候获得的是屏幕点击位置的坐标。event.getX() 与 event.getRawX()获取的值是一样的,event.getY() 与 event.getRawY()获取的值是一样



下面简单来讲讲onTouch和onTouchEvent的区别

onTouch:属于某个组件的OnTouchListener接口,点击组件有效

onTouchEvent:属于Activity,点击全屏幕有效

onTouchEvent可以用来实现雷霆战机之类的游戏的飞机移动的效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: