【问题标题】:Is it possible to do animation with drawables?可以用drawables做动画吗?
【发布时间】:2015-09-11 00:35:27
【问题描述】:

我一直在为我最近编程的纸牌游戏添加动画,最近添加到这些 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>

整数.xml

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

不久之后,我意识到我的卡片是可绘制的,所以我获得运动的唯一方法是移动整个画布,这会产生太多问题。有什么办法可以在没有画布的情况下单独移动卡片,还是我必须将所有卡片重置为图像而不是可绘制对象?

【问题讨论】:

  • 你如何使用这些卡drawables?您是在onDrawView 中自己绘制它们吗?
  • 是的,我在 onDraw 中使用它们
  • 我觉得这样的话,如果你有自己的view,就需要在onDraw方法里面写自己的动画行为

标签: android drawable


【解决方案1】:

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

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

首先,在你的 View 类中定义一个 Transformation 变量和一个 Animation 变量:

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()中,传入当前时间和transformation来更新transformation,然后在绘制前应用到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,并处理 null 和其他 View 状态,但这应该为您提供一个起点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多