Tôi đã tạo một onTouchListener để kéo Chế độ xem. Hình ảnh kéo mượt mà nếu tôi sử dụng getRawX()
và getRawY()
. Vấn đề với đó là hình ảnh sẽ nhảy đến con trỏ thứ hai khi bạn đặt con trỏ thứ hai xuống rồi nhấc con trỏ đầu tiên lên.Nhảy ImageView trong khi kéo. Các giá trị getX() và getY() đang nhảy
OnTouchListener này cố gắng khắc phục sự cố đó bằng cách theo dõi pointerId
. Vấn đề với onTouchListener này là trong khi kéo một ImageView, ImageView nhảy xung quanh khá điên cuồng. Giá trị getX()
và getY()
nhảy xung quanh.
Tôi cảm thấy như tôi đang làm điều này một cách chính xác. Tôi không muốn phải viết một cái nhìn tùy chỉnh cho điều này bởi vì tôi đã thực hiện một scaleGestureDetector và viết một rotationGestureDetector tùy chỉnh hoạt động. Mọi thứ đều hoạt động tốt nhưng tôi cần khắc phục sự cố tôi nhận được khi sử dụng getRawX()
và getRawY()
.
Có ai biết tôi đang làm gì sai ở đây không?
Dưới đây là onTouchListener tôi:
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);
Bất kỳ ai có giải pháp này? Có vẻ như những người khác đã gặp phải vấn đề này, nhưng tôi vẫn chưa tìm được giải pháp nào. –