stroke width 在 android shape 中生效需同时设置 android:width>0 且 android:color(含透明色),并确保父容器留出绘制空间、未被覆盖或裁剪,单位推荐 dp 但需注意小屏模糊风险,material 组件应优先使用专用属性而非自定义 shape。

stroke width 在 Android shape 中实际生效的条件
直接写 android:width="2dp" 不一定有边框,因为 stroke 必须和 android:color 一起存在才被渲染;只设宽度、不设颜色,线条完全不可见。
-
android:width值必须大于 0,"0dp"或"0px"等效于无描边 - 颜色必须明确指定,哪怕用透明色:
android:color="#00000000"(注意是 8 位十六进制,带 alpha) - 如果父容器或背景遮盖了描边(比如
padding不足),视觉上也会“消失”
dp / px / sp 单位在 stroke width 中的区别与风险
android:width 只接受尺寸值,不支持相对单位(如 sp),且系统会按当前密度自动缩放 dp —— 这是多数人画线变粗/变细的根源。
- 用
"2dp":推荐,适配不同屏幕密度,但需注意小屏设备上可能缩到小于 1 像素,显示为模糊或不可见 - 用
"2px":强制固定像素,跨设备粗细一致,但高密度屏下会显得极细(比如在 xxhdpi 上仅占物理 2 像素) - 别用
sp:编译报错Resource$NotFoundException或解析失败
示例有效写法:
<stroke android:width="1.5dp" android:color="#FF666666" />
为什么设置了 stroke width 却看不到边框?常见排查点
不是代码写错,而是被其他属性“吃掉”了。最常踩的坑是形状本身没留出空间给描边。
- shape 是
rectangle但没设android:padding,描边一半画在 View 边界外,被裁剪 - 使用了
android:innerRadius或android:useLevel="true"等干扰绘制逻辑的属性,导致 stroke 被忽略 - XML 文件被放在
res/drawable-v21/下,而运行在低版本系统,fallback 到无 stroke 的旧资源 - View 的
background被 Java/Kotlin 代码动态替换,XML 描边彻底失效
在 ConstraintLayout 或 Material 组件中使用时的兼容性注意
MaterialButton、CardView 等默认自带背景处理逻辑,直接设 android:background="@drawable/my_shape" 可能导致 stroke 被覆盖或抗锯齿异常。
- CardView 应优先用
app:cardStrokeWidth和app:cardStrokeColor,而非自定义 shape - ConstraintLayout 内子 View 若设了
outlineProvider="background",描边可能影响阴影轮廓,需测试是否需要android:clipToOutline="false" - Android 12+ 使用
ShapeAppearanceModel自定义 corner & stroke 时,XML 中的stroke完全不生效
描边真正起作用的地方,永远是它被最终绘制的那一层——不是你写了,它就一定出现在屏幕上。










