我有一个相当复杂的矢量图形,想要进行动画化处理。我使用了@RomanNurik 的Web工具,将svg文件转换成了动画。
这样就得到了一个有效的<animated-vector>
,根据文档,它是一个“一体化”的XML文件。
XML文件将可绘制对象分为两个组,每个组包含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>
问题一:
由于不同的ObjectAnimators
具有不同的android:duration
和android:startOffset
值,因此我不能使用android:repeatCount="infinite"
,否则在运行一段时间后动画会混乱。所以最好的方法是通过编程来重复它。
问题二:
无论是AnimatedVectorDrawableCompat
还是AnimatedVectorDrawable
都没有一个方法表明动画应该循环播放。
问题三:
AnimatedVectorDrawableCompat没有registerAnimationCallback()
方法,因此我无法监听onAnimationEnd
并重新启动动画。此时,我放弃了向后兼容。
问题四:
我目前使用的实现方法使用了AnimatedVectorDrawable
中的registerAnimationCallback()
,但仅在Android API 25上有效,即使这些方法已在API 23中添加。
AnimatedVectorDrawable drawable = (AnimatedVectorDrawable) context().getDrawable(R.drawable.long_press_anim);
imageView.setImageDrawable(drawable);
drawable.registerAnimationCallback(new Animatable2.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
super.onAnimationEnd(drawable);
((AnimatedVectorDrawable) drawable).start();
}
});
drawable.start();
在 API 23 和 24 中,动画只会播放一次,不会重复。
有什么解决方法吗?我快要放弃了,准备使用烂掉的 PNG 序列代替。