基本上我有这段代码,可以水平拖动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正确地跟随我的手指,谢谢!
答案 0 :(得分:0)
这是获得相同结果的简单得多的方法:
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;
}
});