私はビューをドラッグするためのonTouchListenerを作成しました。 getRawX()
とgetRawY()
を使用すると、画像がスムーズにドラッグされます。その問題は、2番目のポインタを下にして最初のポインタを上げると、イメージが2番目のポインタにジャンプすることです。ドラッグ中にImageViewをジャンプします。 getX()とgetY()の値がジャンプしています
このonTouchListenerは、pointerId
を追跡することによってその問題を解決しようとします。このonTouchListenerの問題は、ImageViewをドラッグしている間にImageViewがかなり狂ってジャンプしてしまうことです。 getX()
とgetY()
の値がジャンプします。
私はこれを正しくやっているように感じます。私はすでにscaleGestureDetectorを実装していてカスタムのrotateGestureDetectorを記述しているため、カスタムビューを作成する必要はありません。すべて正常に動作しますが、私はgetRawX()
とgetRawY()
を使用するときに得られる問題を解決する必要があります。
私がここで間違っていることを誰かが知っていますか?ここで
は私の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);
誰にも解決策がありますか?他の人がこの問題に遭遇したようですが、まだ解決策が見つかりませんでした。 –