[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;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值