android真机上ctx.setlinedash无效需满足四条件:基础库≥2.21.0、canvas显式设type="2d"、传非空偶数数字数组(如[4,3])、每次stroke前调beginpath并紧邻stroke调用。

Android真机上ctx.setLineDash无效?先确认是否用了旧版Canvas API
微信小程序 Android 端对 ctx.setLineDash 的支持有明确版本门槛:仅在基础库 2.21.0+ 且使用 type="2d" 的 Canvas 上才生效。如果你用的是默认 type="default"(即不写 type),或基础库低于该版本,调用 setLineDash 会静默失败,线条仍为实线。
实操建议:
- 必须显式声明
<canvas canvas-id="myCanvas" id="myCanvas" type="2d"></canvas>—— 少一个属性都可能失效 - 检查真机微信版本对应的基础库:Android 微信 8.0.45 对应基础库约 2.20.x,需升级到 8.0.47+ 才稳定支持
- 不要依赖
ctx.getLineDash()判断是否生效,它在 Android 上始终返回空数组,无法用于检测
setLineDash传参格式不对?Android只认数字数组,不接受null或空数组
Android 下 ctx.setLineDash([5, 5]) 可用,但 ctx.setLineDash([])、ctx.setLineDash(null) 或 ctx.setLineDash([0, 0]) 都会导致后续 stroke() 绘出实线,且无任何报错。
实操建议:
- 虚线启用时,务必传长度为偶数的非空数字数组,如
[4, 3]、[6, 2, 2, 2] - 恢复实线不能用
setLineDash([]),而应调用ctx.setLineDash([0])(微信文档明确推荐) - 避免动态计算后传入
NaN或Infinity元素,Android 会直接忽略整组设置
draw()前没重置路径?虚线样式在Android下不继承上一次stroke状态
Android 真机上,setLineDash 的作用域严格绑定到当前路径(current path)。如果你在同一 ctx 上连续调用 stroke() 而中间没调 beginPath(),第二次 stroke 会丢失虚线样式,变成实线。
Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开数据库、非查询SQL操作指令、查询SQL指令-游标Cursors等知识。
实操建议:
- 每次绘制独立虚线前,必须配对使用
ctx.beginPath()+ctx.moveTo()+ctx.lineTo() - 不要复用路径对象;避免在循环中只调一次
beginPath()然后多次lineTo()+stroke() - 若需多段虚线,每段都走完整流程:
beginPath → moveTo → lineTo → setLineDash → stroke
canvas尺寸缩放导致虚线“糊成实线”?Android对像素级渲染更敏感
当 canvas 的 CSS 宽高(如 style="width: 375px; height: 200px;")与其属性宽高(如 width="750")不匹配,或未处理 window.devicePixelRatio 时,Android 会把虚线段长按物理像素压缩,最终视觉上连成实线。
实操建议:
- 确保
width和height属性值 = CSS 尺寸 × devicePixelRatio(H5需算,小程序自动适配,但显式设更稳) - 在 Android 真机调试时,用
uni.getSystemInfoSync().pixelRatio获取实际比例,动态设置 canvas 属性 - 虚线段长建议 ≥ 2 物理像素,例如目标为 2px 虚线,传入
[4, 4](假设 dpr=2)
最易被忽略的一点:Android 下 setLineDash 不触发重绘,必须紧跟在 stroke() 前调用,且不能被其他绘图命令(如 fill())意外打断。一旦漏掉 stroke() 或中间插入了 fillRect,虚线就彻底失效,还查不出原因。










