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,就是相对于起始位置没有移动,所以回到原位