如何在视图组(android)中移动视图?

时间:2014-11-17 03:54:44

标签: android drag ontouchevent

我在视图组中拖动/移动视图时遇到问题。

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

目前我正在尝试通过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;
}

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

这是错误的方法吗?我是否应该尝试通过PaletteView实现可移动性,其中添加了PaintViews而不是PaintView本身(我在技术上已尝试过)?它是否可能是由PaletteView中的自定义布局引起的问题?任何反馈将不胜感激。

1 个答案:

答案 0 :(得分:2)

您应该将拖动侦听器添加到要移动的单个视图中(例如:paintviews)。我不确定你面临的确切问题。最好显示拖动效果的结果,看看问题出在哪里

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