本文讲解两个示例,控件跟随手指移动
示例一:
private int lastX;
private int lastY;
//布局底部导航栏高度
private int mNavigationHeight;
//手机底部导航栏高度
private int mNavBarHeight;
//手机屏幕高度
private int mScreenHeight;
//手机屏幕宽度
private int mScreenWidth;
bindId(R.id.ctl_suspend_play).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
int left = (int) v.getX() + x - lastX;
int top = (int) v.getY() + y - lastY;
if (top + v.getHeight() >= mScreenHeight - mNavigationHeight - mNavBarHeight) {
top = mScreenHeight - mNavigationHeight - mNavBarHeight - v.getHeight();
} else if (top <= 0) top = 0;
if (left + v.getWidth() >= mScreenWidth) {
left = mScreenWidth - v.getWidth();
} else if (left <= 0) left = 0;
v.setX(left);
v.setY(top);
break;
}
}
lastX = x;
lastY = y;
return true;
}
});
示例二:
//按下时的Y
private int mPressY;
//按下时的X
private int mPressX;
//当前移动的Y
private int mMoveY;
//当前移动的X
private int mMoveX;
//布局底部导航栏高度
private int mNavigationHeight;
//手机底部导航栏高度
private int mNavBarHeight;
//手机屏幕高度
private int mScreenHeight;
//手机屏幕宽度
private int mScreenWidth;
bindId(R.id.ctl_suspend_play).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mPressY = (int) event.getRawY();
mPressX = (int) event.getRawX();
mMoveY = (int) v.getY();
mMoveX = (int) v.getX();
break;
case MotionEvent.ACTION_MOVE:
int x = (int) event.getRawX();
int y = (int) event.getRawY();
int vHeight = v.getHeight();
int vWidth = v.getWidth();
if (y > mPressY) {
int add = y - mPressY;
mMoveY += add;
if (mMoveY + vHeight >= mScreenHeight - mNavigationHeight - mNavBarHeight) {
mMoveY = mScreenHeight - mNavigationHeight - mNavBarHeight - vHeight;
}
} else {
int sub = mPressY - y;
mMoveY -= sub;
if (mMoveY < 0) mMoveY = 0;
}
if (x > mPressX) {
int add = x - mPressX;
mMoveX += add;
if (mMoveX + vWidth >= mScreenWidth) {
mMoveX = mScreenWidth - vWidth;
}
} else {
int sub = mPressX - x;
mMoveX -= sub;
if (mMoveX < 0) mMoveX = 0;
}
v.setX(mMoveX);
v.setY(mMoveY);
mPressY = y;
mPressX = x;
break;
}
return true;
}
});