android - 如何在 View 组 (android) 中移动 View ?

标签 android drag touch-event

我在 View 组内拖动/移动 View 时遇到问题。

在我的根 Activity 中,我有一个线性布局,它添加了两个自定义 View - PaintAreaView 和 PaletteView。在我的 PaletteView 类(它扩展了 ViewGroup)中,我添加了几个第三个 View PaintView。 PaletteView 以自定义布局排列 PaintView。我需要能够在 PaletteView 周围拖动 PaintViews,但我无法利用我在我的应用程序中成功找到的任何拖动或移动教程。我对这一切都很陌生,所以也许我缺少一些基本的东西。这感觉很简单,所以我想我遗漏了一些非常明显的东西,但我们非常欢迎任何帮助!

目前我正在尝试通过 PaintView 类实现可移动性,如下所示:

@Override
public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();

    final int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK)
    {
        case MotionEvent.ACTION_DOWN:
        {
            mLastTouchX = x;
            mLastTouchY = y;

            // Save the ID of this pointer
            mActivePointerId = event.getPointerId(0);
            break;
        }

        case MotionEvent.ACTION_MOVE:
        {
            final int pointerIndex = event.findPointerIndex(mActivePointerId);
            x = event.getX(pointerIndex);
            y = event.getY(pointerIndex);

            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;

            mPosX += dx;
            mPosY += dy;

            mLastTouchX = x;
            mLastTouchY = y;

            invalidate();
            break;
        }

        case MotionEvent.ACTION_UP:
        {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_CANCEL:
        {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_POINTER_UP:
        {
            final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = event.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId)
            {
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = event.getX(newPointerIndex);
                mLastTouchY = event.getY(newPointerIndex);
                mActivePointerId = event.getPointerId(newPointerIndex);
            }
            break;
        }
    }
    return true;
}

我尝试过的一切都失败了,所以作为基础,我从一个教程中借用了它,该教程在移动单个 View 时效果很好。但即使它对我不起作用。发布所有代码会太多,但是如果任何其他代码有帮助,请告诉我。

这是错误的做法吗?我是否应该尝试通过添加 PaintView 的 PaletteView 来实现可移动性,而不是在 PaintView 本身(技术上我已经尝试过)?在 PaletteView 中使用自定义布局可能会导致问题吗?任何反馈将不胜感激。

最佳答案

您应该将拖动监听器添加到您想要四处移动的单个 View (例如:绘画 View )。我不确定您面临的确切问题。最好能展示一下拖拽效果的结果,看看问题出在哪里

拖放来源:http://www.vogella.com/tutorials/AndroidDragAndDrop/article.html

关于android - 如何在 View 组 (android) 中移动 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965258/

相关文章:

javascript - 为什么touchevent不在手指按下的中间?

java - 在 OnTouch 中更改页面

android - 如何将现有的android项目导入到eclipse中

java - 切换Activity后Fragment Activity消失

java - 从 onCameraFrame、OpenCV、Android/Java 调用 HoughCircles() 方法时改变慢帧速率

javascript - Fabric Js 将一个图像拖动到另一个图像上

javascript - 使用 Dragstart PreventDefault 禁用浏览器默认图像拖动,但它也禁用我的拖动事件

android - list 合并失败 : Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported`

scroll - 在 GTK+ 应用程序中拖动滚动

javascript - 用移动设备的触摸事件模拟拖放事件