是否可以使用可绘制对象制作动画?
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,这是制作动画的新的更好的方法。
我一直致力于为我最近编写的纸牌游戏添加动画,最近在这些 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,这是制作动画的新的更好的方法。