在实现event.move中view跟着手指移动的功能时,发现getX和getRawX虽然都能实现,但是仔细研究起来还是有所区别的。 首先在getRawX方法中
int currentx=(int)event.getRawX();
int currenty=(int)event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = currentx;
lasty = currenty;
break;
case MotionEvent.ACTION_MOVE:
int temx = currentx-lastx;
int temy = currenty-lasty;
layout(getLeft()+temx,getTop()+temy,getRight()+temx,getBottom()+temy);
lastx = currentx;
lasty = currenty;
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
流程应该没什么,在down中获取当前的位置,在Move中移动到新位置减去down中的位置获取差值,再用layout去重新设置布局。这样会很丝滑。但是如果将第一行的event.getRawX()替换成event.getX()后,会发现view非常不跟手以及停在某一点后会极度的抖动。 分析原因: 假设view的大小为200*200,getX()获取为100,在down的那一刻,lastx=100,接下来的移动过程中假设移动到159的位置,此时差值50,于是layout开始移动50,移动后将当前的150赋值给lastx,那么此时我们会发现手指按理来说带着view移动,相对于view的位置是不变的,结果现在变了,因此会出现抖动,不停的改变位置。此时可以去掉
lastx = currentx;
lasty = currenty;
两行,保持lastx对于view的相对位置的不变,于是会发现跟手没有抖动。代码如下:
int currentx=(int)event.getX();
int currenty=(int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = currentx;
lasty = currenty;
break;
case MotionEvent.ACTION_MOVE:
int temx = currentx-lastx;
int temy = currenty-lasty;
layout(getLeft()+temx,getTop()+temy,getRight()+temx,getBottom()+temy);
// lastx = currentx;
// lasty = currenty;
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
|