Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 拖动时跳转ImageView. getX()和getY()值正在跳跃大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经创建了一个用于拖动视图的onTouchListener.如果我使用getRawX()和getRawY(),图像会平滑地拖动.问题是,当您向下放置第二个指针然后抬起第一个指针时,图像将跳转到第二个指针.

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

我觉得我正确地做到了这一点.我不想为此编写自定义视图,因为我已经实现了scaleGestureDetector并编写了一个有效的自定义rotateGestureDetector.一切正常但我需要解决使用getRawX()和getRawY()时遇到的问题.

有谁知道我在这里做错了什么?

这是我的onTouchListener:

final View.onTouchListener onTouchListener = new View.onTouchListener()
{
    @Override
    public @R_489_8487@an 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()返回相对于视图的坐标.我会移动视图,重置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()值正在跳跃全部内容,希望文章能够帮你解决android – 拖动时跳转ImageView. getX()和getY()值正在跳跃所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。