Android Studio中AnimatedVectorDrawable渐变动画报错求助
问题分析与修复方案
核心问题
报错的根本原因是:AnimatedVectorDrawable(AVD)的<target>标签仅能识别VectorDrawable结构里的<vector>、<group>、<path>这类顶层可动画元素,你给渐变<gradient>下的<item>设置name并作为动画目标,AVD无法识别这类节点,因此抛出找不到目标的异常。
修复方案
方案1:通过平移渐变区域实现滑动效果
修改动画逻辑,通过动态调整渐变的startX和endX属性,让高亮区域整体滑动,替代修改渐变item的offset:
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> <vector android:width="156dp" android:height="2dp" android:viewportWidth="156" android:viewportHeight="2"> <path android:name="loading_path" android:pathData="M0,0H156V2H0Z"> <aapt:attr name="android:fillColor"> <gradient android:startX="-78" android:startY="2" android:endX="78" android:endY="2" android:type="linear"> <item android:color="#00229ED9" android:offset="0" /> <item android:color="#FF229ED9" android:offset="0.4" /> <item android:color="#FF229ED9" android:offset="0.6" /> <item android:color="#00229ED9" android:offset="1" /> </gradient> </aapt:attr> </path> </vector> </aapt:attr> <target android:name="loading_path"> <aapt:attr name="android:animation"> <objectAnimator android:duration="1000" android:interpolator="@android:anim/linear_interpolator" android:propertyName="fillColor.startX" android:valueFrom="-78" android:valueTo="234" android:repeatCount="infinite" android:valueType="floatType" /> </aapt:attr> <aapt:attr name="android:animation"> <objectAnimator android:duration="1000" android:interpolator="@android:anim/linear_interpolator" android:propertyName="fillColor.endX" android:valueFrom="78" android:valueTo="312" android:repeatCount="infinite" android:valueType="floatType" /> </aapt:attr> </target> </animated-vector>
方案2:拆分高亮区域为独立路径动画
将原本的渐变高亮部分拆分为两个独立的矩形路径,通过动画路径的X轴平移实现效果,AVD可正常识别路径作为动画目标:
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> <vector android:width="156dp" android:height="2dp" android:viewportWidth="156" android:viewportHeight="2"> <!-- 背景透明条 --> <path android:pathData="M0,0H156V2H0Z" android:fillColor="#00229ED9" /> <!-- 高亮条1 --> <path android:name="highlight1" android:pathData="M62.4,0H93.6V2H62.4Z" android:fillColor="#FF229ED9" /> <!-- 高亮条2 --> <path android:name="highlight2" android:pathData="M93.6,0H124.8V2H93.6Z" android:fillColor="#FF229ED9" /> </vector> </aapt:attr> <target android:name="highlight1"> <aapt:attr name="android:animation"> <objectAnimator android:duration="300" android:interpolator="@android:anim/decelerate_interpolator" android:propertyName="translateX" android:valueFrom="0" android:valueTo="-31.2" android:repeatMode="reverse" android:repeatCount="infinite" android:valueType="floatType" /> </aapt:attr> </target> <target android:name="highlight2"> <aapt:attr name="android:animation"> <objectAnimator android:duration="300" android:interpolator="@android:anim/decelerate_interpolator" android:propertyName="translateX" android:valueFrom="0" android:valueTo="31.2" android:repeatMode="reverse" android:repeatCount="infinite" android:valueType="floatType" /> </aapt:attr> </target> </animated-vector>
注意事项
MainActivity中的启动代码无需修改,保持原样即可:
AnimatedVectorDrawable drawable = (AnimatedVectorDrawable) bind.loading.getDrawable(); drawable.start();
内容的提问来源于stack exchange,提问作者Amir Rahimian
相关产品推荐
相关产品推荐

