如何通过代码自定义Animated Vector Drawable的动画时长

问题
我有一个仅使用XML Object Animator的Animated Vector Drawable,启动应用后它会正常播放动画。请问如何通过代码控制部分目标或组件的动画时长?
解决方案
要单独控制Animated Vector Drawable(AVD)中部分组件的动画时长,核心是通过代码定位到对应ObjectAnimator实例,再动态修改其时长属性,具体步骤如下:
1. 给XML中的动画设置唯一ID
首先确保你的AVD及其关联的ObjectAnimator XML里,给需要控制的动画设置android:id,这样才能在代码中精准定位:
比如你的AVD文件(res/drawable/avd_demo.xml):
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/base_vector"> <!-- 第一个需要控制的目标组件 --> <target android:name="icon_path" android:animation="@anim/anim_icon_path"/> <!-- 第二个目标组件 --> <target android:name="bg_circle" android:animation="@anim/anim_bg_scale"/> </animated-vector>
对应的动画文件(res/anim/anim_icon_path.xml):
<objectAnimator android:id="@+id/anim_icon_path" <!-- 必须设置ID --> android:duration="1000" android:propertyName="pathData" android:valueFrom="M10,10 L20,20" android:valueTo="M10,20 L20,10" android:valueType="pathType"/>
2. 在代码中修改指定动画的时长
假设你把AVD设置在ImageView中,可通过以下方式修改:
Kotlin 实现
val avd = imageView.drawable as AnimatedVectorDrawable // 通过ID找到对应的Animator val pathAnimator = avd.findAnimatorById(R.id.anim_icon_path) // 修改时长为2500毫秒 pathAnimator?.duration = 2500 // 如果需要修改另一个动画 val scaleAnimator = avd.findAnimatorById(R.id.anim_bg_scale) scaleAnimator?.duration = 1500 // 启动/重启动画 avd.start()
Java 实现
AnimatedVectorDrawable avd = (AnimatedVectorDrawable) imageView.getDrawable(); Animator pathAnimator = avd.findAnimatorById(R.id.anim_icon_path); if (pathAnimator != null) { pathAnimator.setDuration(2500); } Animator scaleAnimator = avd.findAnimatorById(R.id.anim_bg_scale); if (scaleAnimator != null) { scaleAnimator.setDuration(1500); } avd.start();
3. 注意要点
- 必须给
ObjectAnimator设置android:id,否则无法通过findAnimatorById获取实例。 - 如果AVD已经处于播放状态,修改时长后需要调用
start()重新启动才能生效;若未播放,修改后直接启动即可。 - 每个
ObjectAnimator可以独立设置不同时长,互不影响。
内容的提问来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

