strokewidth属性必须写在标签内,单位为dp,仅api 21+支持动态修改,且需换算为px;受scale、viewport、filltype等影响,端点默认圆头,不支持linecap/linejoin控制。

strokeWidth 属性必须写在 <path></path> 标签里,不能放在 <vector></vector> 或 <group></group> 上
Android 的 vector drawable 中,strokeWidth 是 <path></path> 的专属属性,作用对象是该路径的描边。很多人误以为可以像 CSS 那样在父容器统一设置,结果改了 <vector></vector> 的 android:strokeWidth(根本不存在这个属性)或者给 <group></group> 加,完全没效果。
实操建议:
-
strokeWidth值单位只能是dp,不支持px、sp或无单位数字 - 如果路径原本没有描边(即没设
android:strokeColor),只加strokeWidth不会显示线条 - 最小有效值通常是
0.5dp;设成0dp会消失,但不要设负数或空字符串
<path
android:strokeColor="#FF0000"
android:strokeWidth="2.5dp"
android:fillColor="#00000000"
android:pathData="M10,10 L90,10" />用 android:scaleX/android:scaleY 缩放整个 path 也会等比放大 strokeWidth
如果你发现线条变粗了但没动 strokeWidth,大概率是路径被缩放了。Vector drawable 中,<group></group> 的 android:scaleX 和 android:scaleY 会同时缩放路径几何和描边宽度——这是 SVG 渲染规则在 Android 上的忠实实现,不是 bug。
常见错误现象:
- 图标在不同分辨率设备上线条粗细不一致,其实是缩放逻辑被意外触发
- 用
android:viewportWidth和android:viewportHeight调整画布后,忘了同步检查<group></group>是否带缩放 - 从设计稿导出 SVG 时工具自动加了
transform="scale(…)",转成 vector 后变成<group></group>的 scale 属性
API 21+ 才支持 strokeWidth 动态修改,低版本需预置多套 XML
运行时通过 mutate() + setStrokeWidth() 修改 Path 描边粗细,仅对 VectorDrawableCompat 在 API 21+ 有效。低于 21 的设备调用会静默失败,线条保持原始粗细。
使用场景:
- 需要响应触摸状态(如按下时加粗边框)
- 主题切换时动态调整 icon 线条重量
实操建议:
- 不要依赖运行时修改做兼容性兜底;关键 UI 元素应提前准备
ic_icon_thin.xml/ic_icon_bold.xml - 若必须动态改,先用
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP判断 -
setStrokeWidth(float)的参数单位是像素(px),不是 dp,需手动换算:context.resources.displayMetrics.density * dpValue
描边粗细受 android:fillType 和路径闭合影响,非闭合线段两端默认是圆头
strokeWidth 显示效果不只取决于数值,还和路径是否闭合、android:fillType、以及端点/拐角样式有关。Android vector 默认用 android:fillType="evenOdd",且不提供 strokeLineCap 或 strokeLineJoin 控制(这些在 SVG 里有,但 Android vector XML 不支持)。
容易踩的坑:
- 画一条短横线(
M10,10 L20,10),设strokeWidth="4dp",实际视觉长度会比预期长——因为两端是圆头(round cap),各多出 2dp 半径 - 两个线段拼接处出现“重叠加粗”,是因为 Android 没有
strokeLineJoin="miter"控制,一律按默认斜接处理 - 用
fillColor+strokeColor同时存在时,fillType会影响填充区域,间接改变描边可见范围
如果对端点形状敏感,老老实实把路径首尾坐标手动外扩或内缩,比指望 XML 属性更可控。
复杂点在于:strokeWidth 看似简单,但它和 viewport、scale、density、fillType、甚至系统渲染管线都耦合。改一个值之前,最好先在不同屏幕密度的设备上真机预览下——模拟器有时会骗人。










