android 中View测量,布局和滑动的属性区分

3 篇文章 0 订阅
2 篇文章 0 订阅

getRawX():获得当前view的当前位置相对于手机窗体的水平坐标

getX():获得当前view的当前位置相对于他的父容器的水平坐标

getLeft():获得当前view初始位置的左边界相对于他的父容器左边界的水平偏移量

getScrollX():获得当前view的左边界相对于自身的内容的左边界的偏移量,可以为负值

getTranslationX():获得当前view的上一个位置相对于它的初始位置的水平偏移量


代码区分:


private int lastX;
private int lastY;

@Override
public boolean onTouchEvent(MotionEvent event) {

    //move时不断获取绝对位置
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //只在第一次按下时将当前位置记录为起始
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

            //获取移动前位置(即移动后的位置的上一个位置)和初始位置的偏移量
            int offsetX = (int) this.getTranslationX();
            int offsetY = (int) this.getTranslationY();

            //获得移动后位置和移动前位置的偏移量
            int dX = x - lastX;
            int dY = y - lastY;

            //获得总的偏移量并设置为最终位置
            int tX = offsetX + dX;
            int tY = offsetY + dY;

            //移动到最终位置,是个moveBy()操作
            this.setTranslationX(tX);
            this.setTranslationY(tY);

            break;
        case MotionEvent.ACTION_UP:
            break;
    }

    //移动完毕,将当前位置记录为下次移动的起始位置
    lastX = x;
    lastY = y;
    return true;
}


既然要获得总偏移量
 int tX = offsetX + dX;
),完全可以将lastX=x 删掉,比如下面的写法

@Override
public boolean onTouchEvent(MotionEvent event) {

    //move时不断获取绝对位置
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //在第一次按下时将当前位置记录为起始
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

           //直接获取当前位置相对于初始位置的总偏移量
            int dX = x - lastX;
            int dY = y - lastY;

        
            //移动到最终位置,是个moveBy()操作
            this.setTranslationX(dX);
            this.setTranslationY(dY);

            break;
        case MotionEvent.ACTION_UP:
            break;
    }

    return true;
}
这个时候滑动一次抬起手指,再次按下会回到起始位置,因为这时lastX = x; dx =0,所以
this.setTranslationX(dX);这个moveBy()操作的参数就是0,就是相对于起始位置没有移动,所以回到原位


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值