getRawX():獲得當前view的當前位置相對於手機窗體的水平座標
getX():獲得當前view的當前位置相對於他的父容器的水平座標
getLeft():獲得當前view初始位置的左邊界相對於他的父容器左邊界的水平偏移量
getScrollX():獲得當前view的左邊界相對於自身的內容的左邊界的偏移量,可以爲負值
getTranslationX():獲得當前view的上一個位置相對於它的初始位置的水平偏移量
代碼區分:
private int lastX; private int lastY; @Override public boolean onTouchEvent(MotionEvent event) { //當move時不斷獲取絕對位置 int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //只在第一次按下時將當前位置記錄爲起始 lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //獲取移動前位置(即移動後的位置的上一個位置)和初始位置的偏移量 int offsetX = (int) this.getTranslationX(); int offsetY = (int) this.getTranslationY(); //獲得移動後位置和移動前位置的偏移量 int dX = x - lastX; int dY = y - lastY; //獲得總的偏移量並設置爲最終位置 int tX = offsetX + dX; int tY = offsetY + dY; //移動到最終位置,是個moveBy()操作 this.setTranslationX(tX); this.setTranslationY(tY); break; case MotionEvent.ACTION_UP: break; } //移動完畢,將當前位置記錄爲下次移動的起始位置 lastX = x; lastY = y; return true; } 既然要獲得總偏移量
int tX = offsetX + dX;),完全可以將lastX=x 刪掉,比如下面的寫法
@Override public boolean onTouchEvent(MotionEvent event) { //當move時不斷獲取絕對位置 int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //在第一次按下時將當前位置記錄爲起始 lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //直接獲取當前位置相對於初始位置的總偏移量 int dX = x - lastX; int dY = y - lastY; //移動到最終位置,是個moveBy()操作 this.setTranslationX(dX); this.setTranslationY(dY); break; case MotionEvent.ACTION_UP: break; } return true; }這個時候滑動一次擡起手指,再次按下會回到起始位置,因爲這時lastX = x; dx =0,所以
this.setTranslationX(dX);這個moveBy()操作的參數就是0,就是相對於起始位置沒有移動,所以回到原位