如何重启android AnimatedVectorDrawables动画?

时间:2017-01-20 15:57:24

标签: android animation svg android-vectordrawable

我有一个复杂的矢量drawable,我想要动画。 我使用@RomanNurik's网络工具从svg

创建动画

根据the documentatios,这给了我一个有效的<animated-vector>。它是一个“一体化”的XML文件。

xml的drawable分为2组,每组包含2个路径,并且还添加了4个动画,如下所示:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:width="56dp"
            android:height="56dp"
            android:viewportHeight="56.0"
            android:viewportWidth="56.0">
            <group
                android:name="group_1"
                android:pivotX="25"
                android:pivotY="25">
                <path
                    android:name="path_3_1"
                    ... />
                <path
                    android:name="path"
                    ... />
            </group>
            <group
                android:name="group"
                android:pivotX="25"
                android:pivotY="25">
                <path
                    android:name="path_1"
                    ... />
                <path
                    android:name="path_2"
                    ... />
            </group>
        </vector>
    </aapt:attr>
    <target android:name="path">
        <aapt:attr name="android:animation">
            <set xmlns:android="http://schemas.android.com/apk/res/android">
                <objectAnimator
                    android:name="path"
                    ... />
                <objectAnimator
                    android:name="path"
                  .../>
            </set>
        </aapt:attr>
    </target>
    <target android:name="group_1">
        <aapt:attr name="android:animation">
            <set xmlns:android="http://schemas.android.com/apk/res/android">
                <objectAnimator
                    android:name="group_1"
                    ... />
                <objectAnimator
                    android:name="group_1"
                    ... />
                <objectAnimator
                    android:name="group_1"
                    ... />
                <objectAnimator
                    android:name="group_1"
                    ... />
            </set>
        </aapt:attr>
    </target>
    <target android:name="group">
        <aapt:attr name="android:animation">
            <set xmlns:android="http://schemas.android.com/apk/res/android">
                <objectAnimator
                    android:name="group"
                    ... />
                <objectAnimator
                    android:name="group"
                    ... />
                <objectAnimator
                    android:name="group"
                    ... />
                <objectAnimator
                    android:name="group"
                    ... />
            </set>
        </aapt:attr>
    </target>
    <target android:name="path_3_1">
        <aapt:attr name="android:animation">
            <set xmlns:android="http://schemas.android.com/apk/res/android">
                <objectAnimator
                    android:name="path_3_1"
                    ... />
                <objectAnimator
                    android:name="path_3_1"
                    ... />
            </set>
        </aapt:attr>
    </target>
</animated-vector>

问题编号1:

我无法使用android:repeatCount="infinite",因为ObjectAnimators具有不同的android:durationandroid:startOffset值,这会在一些运行后搞乱动画。所以要走的路是以编程方式重复它。很公平。

问题编号2:

AnimatedVectorDrawableCompat或AnimatedVectorDrawable都没有一个方法可以说动画应该循环。

第3期:

AnimatedVectorDrawableCompat没有registerAnimationCallback()所以我可以听onAnimationEnd并自己重启动画。此时,我放弃了逆向兼容性。

第4期:

我使用来自registerAnimationCallback()的{​​{1}}的当前实现仅适用于android API 25,即使这些方法是在API 23中添加的

AnimatedVectorDrawable

在API 23和24中,动画作为一次性运行,不会重复。

任何想法如何解决这个问题?我想要放弃并使用一个狗屎png序列。

3 个答案:

答案 0 :(得分:10)

官方和工作答案在这里:https://issuetracker.google.com/issues/64591234

此代码适用于&gt; = API 16(可能还有14-15)。我正在使用支持库26.1.0和vectorDrawables.useSupportLibrary = true(所以我可以引用xml中的vector drawable而不会崩溃)

animatedVector = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.animated_clock);
ringingAlarmImage.setImageDrawable(animatedVector);
final Handler mainHandler = new Handler(Looper.getMainLooper());
animatedVector.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
    @Override
    public void onAnimationEnd(final Drawable drawable) {
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                animatedVector.start();
            }
        });
    }
});
animatedVector.start();

答案 1 :(得分:2)

我有同样的问题所以我这样做了:

// setup and set animation
AnimatedVectorDrawableCompat animatedVector = AnimatedVectorDrawableCompat.create(context, R.drawable.listening_vector_anim);
imageView.setImageDrawable(animatedVector);

// loop animation!
new Thread(() -> {
    while (imageView.isAttachedToWindow()) {
        try {
            imageView.post(() -> animatedVector.start());
            Thread.sleep(2000); //depends on your animation duration
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();

当ImageView与窗口分离时,此线程将死亡。

答案 2 :(得分:0)

我正在提供一些提示

问题1:android:repeatCount =“0”使其无限。和android:repeatMode =“restart”或“reverse”。

问题2:ObjectAnimator中存在循环。上面的第一号是相同的。

问题3:侦听器在ObjectAnimator上。如果你添加一个监听器,你可以在onAnimationEnd或onAnimationStart上观看。

如果您选择AnimatedVectorDrawable文档中提供的3个文件的其他替代文件,而不是单个文件,您可以放心使用。

这三个是1. VectorDrawable,2。AnimatedVectorDrawable和3.ObjectAnimator

AnimatedVectorDrawable链接另外两个。

Ray Wenderlich的网站上有一篇很好的文章,上面有一个火箭和一个doge动画:https://www.raywenderlich.com/173345/android-animation-tutorial-with-kotlin(带有java代码)。

您还可以阅读Mr.Alex Lockwood撰写的文章“图标动画技术简介”:https://www.androiddesignpatterns.com/2016/11/introduction-to-icon-animation-techniques.html 源代码也可以在GitHub中找到。