You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 05:33:57