查询Android VectorDrawable规范及Android支持的SVG命令清单
我之前在替换PNG为VectorDrawable时也踩过一模一样的坑!Android的VectorDrawable并没有实现完整的SVG行业规范,只支持一个子集,下面就给你整理清楚Android Studio支持的所有SVG命令、元素,以及需要避开的坑:
Android VectorDrawable 支持的SVG子集详解
1. 核心路径命令(Path Commands)
所有基础的路径绘制命令都是支持的,包括绝对(大写)和相对(小写)形式:
M/m:移动到目标坐标(Move to)L/l:绘制直线到目标坐标(Line to)H/h:绘制水平直线到指定X坐标(Horizontal line to)V/v:绘制垂直直线到指定Y坐标(Vertical line to)C/c:三次贝塞尔曲线(Cubic Bézier curve),需要两个控制点+终点S/s:平滑三次贝塞尔曲线(Smooth cubic Bézier curve),自动沿用前一个控制点的对称点Q/q:二次贝塞尔曲线(Quadratic Bézier curve),需要一个控制点+终点T/t:平滑二次贝塞尔曲线(Smooth quadratic Bézier curve)Z/z:闭合当前路径(Close path)
2. 填充与描边属性
- 支持基础填充:
fill(颜色值)、fill-opacity(0-1的透明度) - 支持描边设置:
stroke(颜色)、stroke-width(宽度)、stroke-opacity(透明度)、stroke-linecap(端点样式:butt/round/square)、stroke-linejoin(拐角样式:miter/round/bevel)、stroke-miterlimit(斜接限制) - ⚠️ 注意:填充规则仅支持
nonzero(默认),不支持evenodd
3. 支持的SVG元素
除了<path>之外,还支持这些基础形状元素:
<rect>:矩形,支持rx/ry设置圆角<circle>:圆形<ellipse>:椭圆<line>:直线<polyline>:折线<polygon>:多边形<g>:分组元素,支持transform变换(平移、缩放、旋转)<clipPath>:裁剪路径,但仅支持基于路径的裁剪,不支持复杂图形或文字裁剪<linearGradient>/<radialGradient>:渐变填充,但有严格限制:- 渐变单位仅支持
userSpaceOnUse,不支持objectBoundingBox - 渐变扩散方式仅支持
pad,不支持reflect/repeat - 渐变停止点的
offset必须是0到1之间的数值
- 渐变单位仅支持
4. 绝对不支持的SVG特性(避坑清单)
这些特性导入Android Studio后肯定会出问题,必须提前处理:
<text>:矢量文字元素,必须先转成路径再导入<filter>/<mask>/<pattern>:各种特效、遮罩、图案填充元素<image>:嵌入位图的元素(VectorDrawable是纯矢量,不支持混合位图)- 复杂的
transform组合(比如3D变换) - SVG中的动画元素(
<animate>等),Android VectorDrawable的动画需要用animated-vector单独实现
小技巧
如果导入外部SVG报错,可以试试这两种方法:
- 用Android Studio自带的Vector Asset Studio导入,它会自动尝试转换不兼容的部分(比如把文字转路径)
- 用专业SVG编辑工具(比如Inkscape)把不支持的元素手动转成路径,调整渐变属性后再导入
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

