安卓视图的拖动/动画

19

我不是程序员,但我正在尝试学习Android开发,并且感到非常兴奋。

最近我遇到了一个分岔路口,我不知道我能够找到的任何方向都能满足我的所有需求。这就是你(专家)可以帮助我的地方😉

终点:我想让用户触摸球,并将其拖到屏幕上的任何位置。我还希望在绘制和放下球时对其进行动画处理。

我可以使用自定义类(不扩展任何内容...就像在此教程中找到的类一样:basic drag & drop)完成拖动部分,但是我不知道如何将补间动画应用于它,因为它不是视图。

我还开发了一个ImageView的动画版本,并在其中放置了我的图像,但是我无法在不使用AbsoluteLayout的情况下实现相同的拖放功能,我知道这是不可取的。

那么…我该如何使用MotionEvents将ImageView移动到???布局中,或者如何使用在XML中定义的tween动画处理非视图基础的自定义类?

如果不清楚,请提出问题。我可能不像大多数人一样了解所有术语。

此问题的副本也在anddev.org论坛上,所以我会将此帖子更新为任何我在那里收到的回复。

1个回答

23
为什么不能扩展View类?这样你就可以完全控制它的绘图,因为你可以重写OnDraw()方法。只需要让ColorBall类扩展View类,当移动时更改其位置,然后使那个视图无效并自己绘制,而不是由DrawView类进行绘制。
编辑 - 这里是一个示例类。
public class Card extends View
{
    private Bitmap mImage;
    private final Paint mPaint = new Paint();
    private final Point mSize = new Point();
    private final Point mStartPosition = new Point();

    public Card(Context context)
    {
        super(context);

    }

    public final Bitmap getImage() { return mCardImage; }
    public final void setImage(Bitmap image)
    {
        mImage = image;
        setSize(mCardImage.getWidth(), mCardImage.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        Point position = getPosition();
        canvas.drawBitmap(mCardImage, position.x, position.y, mPaint);
    }

    public final void setPosition(final Point position)
    {
        mRegion.set(position.x, position.y, position.x + mSize.x, position.y + mSize.y);
    }

    public final Point getPosition()
    {
        Rect bounds = mRegion.getBounds();
        return new Point(bounds.left, bounds.top);
    }

    public final void setSize(int width, int height)
    {
        mSize.x = width;
        mSize.y = height;

        Rect bounds = mRegion.getBounds();
        mRegion.set(bounds.left, bounds.top, bounds.left + width, bounds.top + height);
    }

    public final Point getSize() { return mSize; }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        // Is the event inside of this view?
        if(!mRegion.contains((int)event.getX(), (int)event.getY()))
        {
            return super.onTouchEvent(event);
        }

        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            mStartPosition.x = (int)event.getX();
            mStartPosition.y = (int)event.getY();
            bringToFront();
            onSelected();
            return true;
        }
        else if(event.getAction() == MotionEvent.ACTION_MOVE)
        {
            int x = 0, y = 0;

            if(mLock == DirectionLock.FREE || mLock == DirectionLock.HORIZONTAL_ONLY)
            {
                x = (int)event.getX() - mStartPosition.x;
            }

            if(mLock == DirectionLock.FREE || mLock == DirectionLock.VERTICAL_ONLY)
            {
                y = (int)event.getY() - mStartPosition.y;
            }

            mRegion.translate(x, y);
            mStartPosition.x = (int)event.getX();
            mStartPosition.y = (int)event.getY();

            invalidate();

            return true;
        }
        else
        {
            return super.onTouchEvent(event);
        }
    }
}

首先,感谢您的回复。我确定那是一个解决方案。我只是不知道如何使用拖动命令移动视图(ImageView似乎是从逻辑上延伸的最合适的地方),而不引入一个给予我X,Y定位的AbsoluteLayout容器。到目前为止,我能够弄清楚的最好方法是在自定义容器视图的画布上绘制这个类的位置(X,Y)。我不知道是否有任何布局容器(除了AbsoluteLayout)可以以这种方式接受(X,Y)。在我的应用程序中,我需要四个这样的视图,它们都可以在屏幕上拖动。我要再试一次。马上回来 ;) - Peter
我已经将我的“通用”类转换为扩展View的类。在布局中添加它们到(X,Y)并通过(X1,Y1)移动它们的技巧是否与覆盖onLayout()方法有关,然后调用invalidate()方法? - Peter
不,不是覆盖onDraw()方法。我会在我的回答中提供一个例子。 - CaseyB
搞定了(除了区域部分...)。现在它们可以动画化并且我可以拖动它们。无法感谢你的足够! - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接