目录
一、背景
手指拖动控件在屏幕范围内滑动,在边界处做滑动处理,手指离开则自动吸附到右侧
二、思路
【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;
}
};