1. 程式人生 > 其它 >【android】getX和getRawX的用法區別

【android】getX和getRawX的用法區別

在實現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;
        }