dashgap是虚线间隙而非长度,必须与dashwidth成对设置且单位统一为dp;单独设置dashgap无效,缺一不可;android 4.4–7.1下dashgap

dashGap 是虚线间隙,不是虚线长度
很多人调 dashGap 发现线条没变化,或者“越调越大反而变实了”,根本原因是把它和 dashWidth 搞混了:dashGap 控制的是每一段虚线之间的空白距离,不是虚线本身的长短。虚线长度由 dashWidth 决定,两者必须同时设置才生效。
常见错误现象:android:dashGap="5" 单独写,没配 dashWidth → XML 解析失败或直接忽略虚线属性,退化为实线。
-
dashWidth和dashGap必须成对出现,缺一不可 - 两个值都为 0 时,Android 会当作实线处理(不是无限细的虚线)
- 单位统一用
dp,别混用px,否则在高密度屏上间隙会缩得太小,看起来像实线
XML 中 stroke 虚线必须用 shape 容器包裹
直接在 View 的 background 里写虚线是不可能的,Android 不支持内联虚线样式。必须通过 shape drawable 定义,再作为 background 引入。
使用场景:给 TextView 加下划线、FrameLayout 边框、自定义分割线等。
- 根节点必须是
<shape android:shape="rectangle"></shape>(即使画线也得用 rectangle,line 类型不支持 dash 属性) -
<stroke></stroke>标签里才能写android:dashWidth和android:dashGap - 漏掉
android:width和android:color会导致 stroke 不显示,哪怕 dash 参数全对也没用
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dp"
android:color="#666"
android:dashWidth="10dp"
android:dashGap="6dp" />
</shape>
dashGap 太小会导致虚线“粘连”或渲染异常
在 Android 4.4–7.1 系统上,如果 dashGap 小于约 1.5dp,部分机型(尤其三星、华为旧款)会出现虚线连成一片、抖动甚至崩溃。这不是你代码写错,是底层 Skia 渲染的精度限制。
性能影响:过小的 dashGap 会让系统尝试绘制极高频次的短线段,GPU 渲染压力上升,低端机可能出现掉帧。
- 安全下限建议设为
2dp,兼顾视觉节奏和兼容性 - 若设计稿要求极密虚线(如 0.5pt 间隔),改用
BitmapDrawable或自定义Drawable绘制,绕过 XML stroke 限制 - 测试时务必在 Android 5.0 和 6.0 真机上验证,模拟器常掩盖该问题
Java/Kotlin 动态修改 dashGap 几乎不可行
XML 里设好的虚线参数,运行时不能通过 getGradient().setStroke() 或类似方式动态改 dashGap —— GradientDrawable 的 dash 属性是只读的,调用 setStroke() 会清空所有 dash 配置,变回实线。
使用场景:需要根据状态切换实线/虚线,或响应用户操作调整间隔。
- 唯一可靠做法是预置多套
shapeXML 文件(如border_dashed_2dp.xml、border_dashed_8dp.xml),用setBackgroundResource()切换 - 想完全动态控制?只能继承
Drawable自己重写draw(),用Path+Paint.setPathEffect(new DashPathEffect(...)) - 注意:DashPathEffect 在硬件加速开启时可能失效,需调用
setLayerType(LAYER_TYPE_SOFTWARE, null)










