拖动时 ImageView 无法正确移动
ImageView not moving correctly when dragged
基本上我有这段代码,我可以在其中水平拖动 imageView 它目前工作正常,直到我释放并尝试再次移动它它并没有真正跟随我的触摸它只是在触摸前面或只是去某个地方我没有拖动的地方。
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
final int x = (int) motionEvent.getRawX();
final int y = (int) motionEvent.getRawY();
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams)
view.getLayoutParams();
xDelta = x - lParams.leftMargin;
yDelta = y - lParams.topMargin;
startRecording();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.leftMargin = 0;
layoutParams.topMargin = 0;
layoutParams.rightMargin = xDelta - x;
layoutParams.bottomMargin = yDelta - y;
view.setLayoutParams(layoutParams);
break;
}
mainLayout.invalidate();
return true;
}
});
我希望 imageView 正确跟随我的手指,谢谢!
这里有一个更简单的方法来获得相同的结果:
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
xDelta = view.getX() - event.getRawX();
yDelta = view.getY() - event.getRawY();
startRecording();
break;
case MotionEvent.ACTION_MOVE:
view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
break;
default:
return false;
}
return true;
}
});
我不是 100% 确定,但我相信您的问题是由于未将默认布尔值设置为 false 引起的。
编辑:回答评论中的问题。
您可以通过执行以下操作来实现此目的:
(我还没有测试过这个,但它应该可以工作。)
int originalX = micImage.getX();
int originalY = micImage.getY();
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
xDelta = view.getX() - event.getRawX();
yDelta = view.getY() - event.getRawY();
startRecording();
break;
case MotionEvent.ACTION_MOVE:
view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
break;
case MotionEvent.ACTION_UP:
view.animate().x(originalX).y(originalY).setDuration(0).start();
break;
default:
return false;
}
return true;
}
});
基本上我有这段代码,我可以在其中水平拖动 imageView 它目前工作正常,直到我释放并尝试再次移动它它并没有真正跟随我的触摸它只是在触摸前面或只是去某个地方我没有拖动的地方。
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
final int x = (int) motionEvent.getRawX();
final int y = (int) motionEvent.getRawY();
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams)
view.getLayoutParams();
xDelta = x - lParams.leftMargin;
yDelta = y - lParams.topMargin;
startRecording();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.leftMargin = 0;
layoutParams.topMargin = 0;
layoutParams.rightMargin = xDelta - x;
layoutParams.bottomMargin = yDelta - y;
view.setLayoutParams(layoutParams);
break;
}
mainLayout.invalidate();
return true;
}
});
我希望 imageView 正确跟随我的手指,谢谢!
这里有一个更简单的方法来获得相同的结果:
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
xDelta = view.getX() - event.getRawX();
yDelta = view.getY() - event.getRawY();
startRecording();
break;
case MotionEvent.ACTION_MOVE:
view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
break;
default:
return false;
}
return true;
}
});
我不是 100% 确定,但我相信您的问题是由于未将默认布尔值设置为 false 引起的。
编辑:回答评论中的问题。
您可以通过执行以下操作来实现此目的: (我还没有测试过这个,但它应该可以工作。)
int originalX = micImage.getX();
int originalY = micImage.getY();
micImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
xDelta = view.getX() - event.getRawX();
yDelta = view.getY() - event.getRawY();
startRecording();
break;
case MotionEvent.ACTION_MOVE:
view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
break;
case MotionEvent.ACTION_UP:
view.animate().x(originalX).y(originalY).setDuration(0).start();
break;
default:
return false;
}
return true;
}
});