Android Vector Drawable 的 pathData 是 SVG 路径指令的简化子集,支持 M/m、L/l、H/h、V/v、C/c、Z/z 等命令,区分绝对/相对坐标,不支持 S、Q、A 等高级指令,需注意坐标格式、空格分隔及调试方法。

Android Vector Drawable 的 pathData 是定义矢量图形轮廓的核心语法,本质是 SVG 路径指令的简化子集,但不支持所有 SVG 特性(比如不支持贝塞尔曲线的相对坐标缩写、不支持 arc 的椭圆参数变形)。写对的关键在于理解命令字母、坐标规则和常见陷阱。
pathData 基础命令与格式
pathData 是一串空格或逗号分隔的指令序列,每条指令由单个大写或小写字母开头,后跟若干数字坐标。大小写区分绝对/相对坐标:
-
M / m:移动到(MoveTo),只更新起点,不画线;
M x y是绝对坐标,m dx dy是相对于上一个点的偏移 -
L / l:直线到(LineTo);
L x y画到绝对位置,l dx dy画到相对位置 -
H / h:水平线;
H x画到绝对 x(y 不变),h dx水平移动 dx -
V / v:垂直线;
V y画到绝对 y(x 不变),v dy垂直移动 dy -
C / c:三次贝塞尔曲线;需 6 个数:
C x1 y1 x2 y2 x y(控制点1、控制点2、终点),相对形式同理 - Z / z:闭合路径(自动连回起点),大小写无区别,后面不跟数字
实际 XML 示例(带注释)
以下是一个简单箭头图标,用 包裹 :
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:pathData="M 8,12 L 16,12 L 12,16 Z" />
说明:
– M 8,12:从 (8,12) 开始
– L 16,12:画水平线到 (16,12)
– L 12,16:再画斜线到 (12,16)
– Z:自动连回 (8,12),形成三角形箭头
必须注意的细节
- 所有坐标都是**浮点数**,可写
12、12.0或12.5,但不能省略小数点后为 0 的写法(如12.合法,12也合法) - 空格和逗号可混用,但**不能有换行或制表符**(XML 解析器会报错);建议用空格分隔,提高可读性
- Android 不支持
S(平滑三次贝塞尔)、Q(二次贝塞尔)、A(椭圆弧)等高级指令;需要圆角可用C近似模拟 - 路径默认按顺时针绘制,
android:fillType="evenOdd"可改填充规则(用于镂空、复合形状) - 调试技巧:把
pathData复制到在线 SVG 编辑器(如 SVGOMG 或 CodePen)预览,确认形状正确后再粘回 XML
如何从设计稿生成 pathData
手动写复杂路径容易出错,推荐流程:
- 在 Figma / Sketch / Adobe Illustrator 中导出 SVG 文件
- 用工具转成 VectorDrawable:
– Android Studio 自带:右键 res → New → Vector Asset → 选本地 SVG
– 或用开源转换器如 svg2android(更干净,去冗余) - 打开生成的 XML,定位
android:pathData字段,直接复制使用 - 如需微调,先备份原值,再用上面的命令规则小步修改(比如只改某一段坐标)










