Android Vector Drawable的XML怎么写 PathData语法

11次阅读

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

Android Vector Drawable的XML怎么写 PathData语法

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:width=”24dp”
    android:height=”24dp”
    android:viewportWidth=”24″
    android:viewportHeight=”24″>
       android:fillColor=”#000000″
    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),形成三角形箭头

必须注意的细节

  • 所有坐标都是**浮点数**,可写 1212.012.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 字段,直接复制使用
  • 如需微调,先备份原值,再用上面的命令规则小步修改(比如只改某一段坐标)
text=ZqhQzanResources