今天在做一個關于拖動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的長度和寬度)。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5yM0dnZrJDblVjcvwlNzITN0EjMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
當然,如果重寫Activity的onTouchEvent(MotionEvent event) ,這個時候獲得的是螢幕點選位置的坐标。event.getX() 與 event.getRawX()擷取的值是一樣的,event.getY() 與 event.getRawY()擷取的值是一樣
下面簡單來講講onTouch和onTouchEvent的差別
onTouch:屬于某個元件的OnTouchListener接口,點選元件有效
onTouchEvent:屬于Activity,點選全螢幕有效
onTouchEvent可以用來實作雷霆戰機之類的遊戲的飛機移動的效果