是否可以使用可绘制对象制作动画?

Is it possible to do animation with drawables?

我一直致力于为我最近编写的纸牌游戏添加动画,最近在这些 xml 文件中添加:

slide_up_left.xml

     <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="@integer/config_slide_time"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

    <alpha
        android:duration="@integer/config_slide_time"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

    <rotate
        android:duration="@integer/config_slide_time"
        android:fromDegrees="25"
        android:pivotX="0"
        android:pivotY="0"
        android:toDegrees="0" />

 </set>

slide_up_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="@integer/config_slide_time"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

    <alpha
        android:duration="@integer/config_slide_time"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

    <rotate
        android:duration="@integer/config_slide_time"
        android:fromDegrees="-25"
        android:pivotX="100%"
        android:pivotY="0"
        android:toDegrees="0" />

</set>

integers.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources>
     <integer name="config_slide_time">800</integer>
</resources>

不久之后,我开始意识到我的卡片是可抽取的,所以我唯一可以移动的方法就是移动整个 canvas,这会产生太多问题。有没有什么方法可以在没有 canvas 的情况下单独移动卡片,或者我是否必须将所有卡片重置为图像而不是可绘制对象?

由于 android.view.animation 包用于动画视图,您必须自己管理动画,尽管您仍然可以使用在 XML 中定义的动画。

我假设您正在一些自定义视图中进行绘图。

首先,在您的视图中定义一个转换变量和一个动画变量class:

private Animation mAnimation;
private Transformation mTransformation = new Transformation();

当你想启动动画时,充气一个:

mAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up_left);

然后,设置开始时间和初始化大小:

mAnimation.setStartTime(getDrawingTime());
Rect drawableBounds = mDrawable.getBounds();
mAnimation.initialize(drawableBounds.width(), drawableBounds.height(), getWidth(), getHeight());

现在,在onDraw()中,传入当前时间和变换来更新变换,然后在绘制前应用到canvas:

public void draw(Canvas canvas) {
    mAnimation.getTransformation(getDrawingTime(), mTransformation);
    s.save();
    s.concat(mTransformation.getMatrix());
    mDrawable.setAlpha((int) (mTransformation.getAlpha() * 0xFF));
    mDrawable.draw(canvas);
    s.restore();
}

这是自己动手的基本方法。您必须管理动画的状态,在动画结束时清理它,创建和定位 Drawable,并处理空值和其他视图状态,但这应该给您一个起点。

我还强烈建议研究 ObjectAnimator,这是制作动画的新的更好的方法。