【android】getX和getRawX的用法區別
阿新 • • 發佈:2021-09-04
在實現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; }