gpt4 book ai didi

android - 拖动时跳转 ImageView。 getX() 和 getY() 值在跳跃

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:01 25 4
gpt4 key购买 nike

我已经创建了一个用于拖动 View 的 onTouchListener。如果我使用 getRawX()getRawY(),图像可以顺利拖动。这样做的问题是,当您放下第二个指针然后抬起第一个指针时,图像会跳到第二个指针。

这个 onTouchListener 试图通过跟踪 pointerId 来解决这个问题。这个 onTouchListener 的问题是在拖动 ImageView 时,ImageView 非常疯狂地跳来跳去。 getX()getY() 值跳来跳去。

我觉得我做得对。我不想为此编写自定义 View ,因为我已经实现了一个 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);

最佳答案

问题很简单,但出乎意料。 getRawX/Y() 返回绝对坐标,而 getX/Y() 返回相对于 View 的坐标。我会移动 View ,重置 lastX/Y,图像将不再位于同一位置,因此当我获得新值时它们会关闭。在这种情况下,我只需要在我最初按下图像的地方(使用 `getRawX/Y' 时不是这种情况)。

因此,解决方案是简单地删除以下内容:

// Save where the user's finger was for the next ACTION_MOVE
lastX = x;
lastY = y;

我希望这对以后的人有所帮助,因为我看到其他人也有这个问题,他们有与我相似的代码(重置 lastX/Y)

关于android - 拖动时跳转 ImageView。 getX() 和 getY() 值在跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com