android vectordrawable 不支持 clip-path 属性,解析时直接忽略;可行替代方案是用 trimpathstart/trimpathend 配合 animatedvectordrawable 实现路径擦除动画,需单条连续路径且通过 objectanimator 控制。

clip-path 在 Android Vector Drawable 中根本不可用
Android 的 VectorDrawable 不支持 clip-path 属性,哪怕写进 XML 也不会生效,更别提动画。这是底层渲染限制,不是写法问题。官方文档没明说,但所有实测都验证了这点——解析时直接忽略该属性,无报错、无警告。
常见错误现象:android:clipPath 或 SVG 风格的 clip-path="url(#...)" 写在 <path></path> 里,预览看起来正常,运行时动画完全不动,或者整个图标消失(因 clip 区域被当空处理)。
替代思路只能靠 trimPathStart/trimPathEnd 模拟“擦除”:把图标路径看作一条线,从起点或终点逐步截掉一部分,视觉上就像被擦掉。
用 trimPathStart + ObjectAnimator 实现擦除动画
真正可行的方案是控制路径裁剪比例。关键点在于:必须用 android:pathData 描述为单条连续路径(不能有多个 M 起点),否则 trimPath* 行为不可预测;且动画值范围固定为 0.0 到 1.0。
使用场景:图标是简单线条(如勾号、箭头、心形轮廓),不适用于带填充色块或复杂多段路径的图标。
-
trimPathStart从路径起点开始“擦除”,值从0.0动到1.0就是全擦掉 -
trimPathEnd从终点反向擦除,适合“从右往左”或“从下往上”的擦除方向 - 两个属性可同时用,比如
trimPathStart=0.2+trimPathEnd=0.3表示只保留中间 50% 的路径 - 动画必须用
ObjectAnimator修改trimPathStart字段,不能用ValueAnimator自己 set,因为 VectorDrawable 内部不响应普通 setter
示例(XML 中定义可动画字段):
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:name="icon"
android:fillColor="#000"
android:pathData="M2,12 L10,20 L22,4"
android:trimPathStart="0.0" />
</vector>
动画代码必须调用 AnimatedVectorDrawable + setAnimation
直接对 VectorDrawable 做 ObjectAnimator 是无效的。必须用 AnimatedVectorDrawable 作为载体,通过 android:animation 引用单独的 animator XML 文件,或用代码动态绑定。
容易踩的坑:getDrawable(R.drawable.xxx) 默认返回的是 VectorDrawable,不是可动画版本。必须先用 AnimatedVectorDrawableCompat.create()(兼容低版本)或 resources.getDrawable() + mutate() 后再 cast,否则 start() 没反应。
- 推荐做法:XML 定义
animated-vector,里面明确<target android:name="icon"></target>和对应<animator></animator> - 代码中用
imageView.setImageResource(R.drawable.avd_erase),系统自动识别并启动 - 若需运行时控制,拿到
AnimatedVectorDrawable后调用start(),不要重复调用start(),它不支持重入 - API 21+ 可用
AnimatedVectorDrawable,21 以下必须用AnimatedVectorDrawableCompat,否则崩溃
复杂图标擦除效果需要手动拆分路径
如果图标由多个不相连的路径组成(比如一个带圆圈的勾号),trimPathStart 对每条路径独立生效,无法实现“整体渐进擦除”。这时必须把所有路径合并成一条连续路径,或接受分段擦除的视觉效果。
合并路径不是简单拼接 pathData 字符串。要确保前一段终点与后一段起点坐标一致,中间用 L 或 Z 连接,否则会出断点或跳变。
性能影响很小,但兼容性差:部分低端机型(尤其定制 ROM)对 trimPath* 动画支持不稳定,可能出现闪烁或卡顿。测试时务必在目标最低 API 上真机验证,模拟器容易误判。
最容易被忽略的是:擦除动画依赖路径长度计算,而 VectorDrawable 的长度估算受 strokeWidth 和曲线控制点影响。同一份 pathData 在不同 Android 版本上可能有微小差异,导致擦除速度不一致。










