返回

Android 绘制虚线踩坑记:实线之谜揭晓

Android

Android绘制虚线变为实线?踩坑之旅

引言

在Android开发中,绘制虚线是一项常见操作,但在某些情况下,虚线可能会意外地变为实线,引发令人头疼的调试问题。本文将分享作者在处理Android绘制虚线变为实线问题时的踩坑经历,希望能帮助其他开发者避免类似的麻烦。

踩坑经过

在项目中,需要绘制一条虚线。使用的是Canvas.drawLine()方法,并设置了虚线效果。然而,升级应用版本后,测试人员发现虚线竟然变成了实线。尝试了各种修改,包括调整虚线样式、改变画笔属性等,但问题始终无法解决。

在网上搜索也未能找到合适的解决方案。作者不死心,继续深入研究,终于发现了问题的根源。

问题根源

原来,在Android 9(API 28)及更高版本中,Canvas.drawLine()方法的行为发生了变化。在此之前的版本中,Canvas.drawLine()默认会在两端绘制圆形线帽(Paint.Cap.ROUND)。而在Android 9及更高版本中,默认会绘制方形线帽(Paint.Cap.SQUARE)。

方形线帽会将虚线连接在一起,从而产生实线效果。因此,在Android 9及更高版本中,需要显式地将Paint.Cap属性设置为ROUND,才能正确绘制虚线。

解决方法

知道了问题根源后,解决方法就简单了。在绘制虚线之前,只需将画笔的Paint.Cap属性设置为ROUND即可。修改后的代码如下:

val paint = Paint()
paint.color = Color.BLACK
paint.strokeWidth = 5f
paint.style = Paint.Style.STROKE
paint.pathEffect = DashPathEffect(floatArrayOf(10f, 5f), 0f)
paint.strokeCap = Paint.Cap.ROUND  // 新增此行
canvas.drawLine(x1, y1, x2, y2, paint)

总结

在Android开发中,绘制虚线时,需要注意Android 9(API 28)及更高版本中Canvas.drawLine()方法的改变。默认情况下,Canvas.drawLine()会绘制方形线帽,导致虚线变为实线。需要显式地将画笔的Paint.Cap属性设置为ROUND,才能正确绘制虚线。

分享这次踩坑经历,希望能帮助其他开发者在遇到类似问题时,快速定位问题并找到解决方案。