View 的 Android 拖动/动画

标签 android

我不是程序员,但我正在尝试学习 Android 开发,并且玩得很开心。

最近我遇到了一个岔路口,我不知道我能确定的任何方向都能满足我的所有需求。这是您(专家)可以提供帮助的地方;)

端点:我想让用户触摸一个球,并将它拖到屏幕上的任何位置。我还想在绘制和掉落时为这个球制作动画。

我可以使用自定义类完成拖动部分(它不扩展任何东西......只是在本教程中找到的类:basic drag & drop,但是,我不知道如何应用补间动画因为它不是 View 。

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

那么...我该如何移动 ImageView 周围的 ???使用 MotionEvents 布局,或者我如何动画(使用 XML 中定义的补间)非基于 View 的自定义类?

如果不清楚请提问。我不像你们大多数人那样了解所有术语。

还有一个copy在 anddev.org 论坛上有这个问题,所以我会及时更新这篇文章,以更新我在那里收到的任何回复。

最佳答案

为什么不能扩展View?然后,您可以完全控制它的绘制方式,因为您可以覆盖 OnDraw() 方法。只需让 ColorBall 类扩展 View。当您移动时更改它的位置,然后仅使那个 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);
        }
    }
}

关于 View 的 Android 拖动/动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934175/

相关文章:

c# - 如何从字符串中读取特定行?统一 C#

android - stub 索引指向没有 PSI 的文件 : com. intellij.openapi.fileTypes.UnknownFileType@23713b43

java - 安卓信号处理

java - 如何向服务请求许可

java - 将 UTC 时间戳转换为本地设备时间戳

android - 谷歌播放服务 : How to handle devices that do not have Google Play?

android - 哪个版本的 Android sdk 包含 CameraDevice 类

android - 下载 Android 源代码时出错

Android Studio 无法识别 Gradle 项目

android - 使用 sbt android-plugin 的构建时间长