Android View滑动

学习笔记:使用Android坐标系和视图坐标系两种方法实现View拖动效果。
private float lastX;
private float lastY;

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.e(TAG, "onTouchEvent --> " + event.getAction());
    return method2(event);
}

/**
 * Android 坐标系
 * 1,点下手指记录点击位置在屏幕上的坐标lastX lastY;
 * 2,移动手指更新手指的相对于屏幕的坐标x y;
 * 3,计算手指移动的偏移量,通过layout方法重新设置View的位置;
 * 4,因为用的是Android坐标系,参考系是屏幕,移动前后手指位置发生了改变;
 * 5,更新手指位置lastX和lastY的坐标。
 */
private boolean method2(MotionEvent event) {
    float x = event.getRawX();
    float y = event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN://0
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE://2
            int offsetX = (int) (x - lastX);
            int offsetY = (int) (y - lastY);
            layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
            //note:需要更新lastX和lastY,因为使用的是Android坐标系,执行完layout方法后坐标系是改变了的。
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_UP://1
            break;
        case MotionEvent.ACTION_CANCEL://3
            break;
        case MotionEvent.ACTION_OUTSIDE://4
            break;
    }
    return true;
}

/**
 * 视图坐标系方法
 * 1,点下手指记录点击位置在View上的坐标lastX lastY;
 * 2,移动手指更新手指的相对于View的坐标x y;
 * 3,计算手指移动的偏移量,通过layout方法重新设置View的位置;
 * 4,执行完layout方法后,手指点击的坐标和移动前的坐标保持一致。
 */
private boolean method1(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN://0
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE://2
            int offsetX = (int) (x - lastX);
            int offsetY = (int) (y - lastY);
            Log.e(TAG, "offsetX --> " + offsetX);
            Log.e(TAG, "offsetY --> " + offsetY);
            Log.e(TAG, "getLeft() --> " + getLeft());
            Log.e(TAG, "getTop() --> " + getTop());
            //note: 不用重新设置lastX和lastY的值,执行完layout方法就相当于重新归位了。
            //lastX和lastY是手指在View上的点击位置(相对于View的视图坐标),执行layout方法前后手指在View上的坐标lastX和lastY值是一样的。
            layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
            break;
        case MotionEvent.ACTION_UP://1
            break;
        case MotionEvent.ACTION_CANCEL://3
            break;
        case MotionEvent.ACTION_OUTSIDE://4
            break;
    }
    return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值