Ich habe einen onTouchListener zum Ziehen von Ansichten erstellt. Bilder ziehen reibungslos, wenn ich getRawX()
und verwende. Das Problem dabei ist, dass das Bild zum zweiten Zeiger springt, wenn Sie einen zweiten Zeiger nach unten setzen und dann den ersten Zeiger anheben.Springen ImageView beim Ziehen. getX() und getY() Werte springen
Dieser onTouchListener versucht, dieses Problem zu beheben, indem er die pointerId
verfolgt. Das Problem mit diesem onTouchListener ist beim Ziehen eines ImageViews, das ImageView springt ziemlich irre herum. Die Werte getX()
und getY()
springen umher.
Ich fühle mich wie ich das richtig mache. Ich möchte nicht eine benutzerdefinierte Ansicht dafür schreiben müssen, weil ich bereits einen scaleGestureDetector implementiert und einen benutzerdefinierten rotateGestureDetector geschrieben habe, der funktioniert. Alles funktioniert gut, aber ich muss das Problem beheben, das ich bekomme, wenn ich getRawX()
und benutze.
Weiß jemand, was ich hier falsch mache?
Hier ist meine onTouchListener:
final View.OnTouchListener onTouchListener = new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
relativeLayoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
{
final float x = event.getX();
final float y = event.getY();
// Where the user started the drag
lastX = x;
lastY = y;
activePointerId = event.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE:
{
// Where the user's finger is during the drag
final int pointerIndex = event.findPointerIndex(activePointerId);
final float x = event.getX(pointerIndex);
final float y = event.getY(pointerIndex);
// Calculate change in x and change in y
final float dx = x - lastX;
final float dy = y - lastY;
// Update the margins to move the view
relativeLayoutParams.leftMargin += dx;
relativeLayoutParams.topMargin += dy;
v.setLayoutParams(relativeLayoutParams);
// Save where the user's finger was for the next ACTION_MOVE
lastX = x;
lastY = y;
v.invalidate();
break;
}
case MotionEvent.ACTION_UP:
{
activePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL:
{
activePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP:
{
// Extract the index of the pointer that left the touch sensor
final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = event.getPointerId(pointerIndex);
if(pointerId == activePointerId)
{
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
lastX = (int) event.getX(newPointerIndex);
lastY = (int) event.getY(newPointerIndex);
activePointerId = event.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
};
image1.setOnTouchListener(onTouchListener);
Hat jemand eine Lösung? Scheint so, als wären andere auf dieses Problem gestoßen, aber ich habe noch keine Lösung gefunden. –