我已经创建了一个用于拖动视图的onTouchListener.如果我使用getRawX()和getRawY(),图像会平滑地拖动.问题是,当您向下放置第二个指针然后抬起第一个指针时,图像将跳转到第二个指针.
这个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);