Android View 的拖动/动画

标签 android

我不是程序员,但我正在努力学习 android 开发,并且玩得很开心。

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

端点:我想让用户触摸一个球,然后将它拖到屏幕上的任意位置。我还想在这个球被拉出和落下时为它设置动画。

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

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

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

如果不清楚,请提出问题。我不像你们大多数人那样知道所有的术语。

还有一个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);
        }
    }
}

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

相关文章:

android - 谁能解释android中未绑定(bind)和绑定(bind)服务之间的区别

java - Cordova 插件 (java) 通知不会转到应用程序 - android

android - 如何通过Shell获取Android的网关/路由器IP?

java - 从不同的类调用一个 Intent

java - Activity 类 {yodgobekkomilov.edgar.com.githubapi/yodgobekkomilov.edgar.com.githubapi.SearchActivity} 不存在

android - 通过电话号码查找联系人

java - 自定义 ArrayAdapter 的 ListActvity 过滤器

android - 未注释的参数覆盖@NonNull 参数

android - 在Android中编写后台服务

android - 与其他 Android 设备的 WiFi Direct 设备连接