[android]getX和getRawX的用法区别

Posted 迎风唱情歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
        }

以上是关于[android]getX和getRawX的用法区别的主要内容,如果未能解决你的问题,请参考以下文章

Android getx(),getRawX(),getTop()方法间的区别

Android开发之getX,getRawX,getWidth,getTranslationX等的区别

Android开发之getX,getRawX,getWidth,getTranslationX等的区别

Android开发之getX,getRawX,getWidth,getTranslationX等的区别

android view之getLeft(),getRight(),getTop(),getBottom(),getX(),getY(),getRawX(),getRawY(),getTranslat

MotionEvent中getX()和getRawX()的区别