Android拖动/视图动画

Pet*_*ter 19 android

我不是程序员,但我正在尝试学习android开发,并且有一个爆炸.

最近我在路上遇到了一个叉子,我不知道我能识别的任何方向都能满足我的所有需求.这是您(专家)可以提供帮助的地方;)

端点:我想让用户触摸一个球,并将其拖动到屏幕上的任何位置.我还希望在它被绘制时以及当它被丢弃时为该球制作动画.

我可以使用自定义类完成拖动部分(不扩展任何东西......只是在本教程中找到的类:基本的拖放,但是,我不知道如何将补间动画应用到它因为它不是一个观点.

我还开发了一个ImageView的动画版本,其中包含我的图像,但是,如果不使用AbsoluteLayout,我无法应用相同的拖放功能,我知道这是禁止使用的.

那么......我该如何移动一个ImageView?使用MotionEvents进行布局,或者如何使用基于非视图的自定义类动画(使用XML中定义的补间)?

如果不清楚,请提问.我不知道你们大多数人的所有术语.

在anddev.org论坛上还有一个这个问题的副本,所以我会在这篇文章中更新我对那里的任何回复.

Cas*_*eyB 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)