天天看点

Android 拖动吸顶效果

【1】view支持滑动效果,重写OnTouchListener

【2】根据down/move分别处理,注意边界处理

【3】在up下判断是否靠右侧,不在则自动回弹

private float downRawX;
private float downRawY;
private int maxRightX;
private int maxBottomY;
private View.OnTouchListener touchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v == null || event == null) {
            return false;
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //手指按下
                maxRightX = screenWidth - (v.getRight() - v.getLeft()); //最右边界
                maxBottomY = screenHeight - (v.getBottom() - v.getTop()); //最底边界
                downRawX = event.getRawX();
                downRawY = event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //手指拖动
                float distanceX = event.getRawX() - downRawX;
                float distanceY = event.getRawY() - downRawY;
                float x = v.getX() + distanceX;
                float y = v.getY() + distanceY;
                //边界处理
                if (x > maxRightX) {
                    x = maxRightX;
                } else if (x < 0) {
                    x = 0;
                }
                if (y > maxBottomY) {
                    y = maxBottomY;
                } else if (y < 0) {
                    y = 0;
                }
                v.setX(x);
                v.setY(y);
                downRawX = event.getRawX();
                downRawY = event.getRawY();
                break;
            case MotionEvent.ACTION_UP:
                //手指抬起,默认向右吸顶
                if ((event.getRawX() - event.getX()) < maxRightX) {
                    v.setX(v.getX() + (maxRightX - (event.getRawX() - event.getX())));
                }
                break;
            default:
                break;
        }
        //消费当次事件
        return true;
    }
};