Jetpack Compose中能否仅调用一次drawPath实现填充与边框绘制
问题
我使用代码A基于路径绘制图形,期望为形状填充指定颜色,同时使用不同颜色、不同线宽绘制边框,最终得到了符合预期的效果图A。
我发现代码A中先后两次调用drawPath执行绘制操作,推测该实现或许并非最优方案,想确认是否可以仅调用一次drawPath,就同时完成形状填充与边框绘制的效果?
代码A
fun setProcess(drawScope: DrawScope, dataList: List<Double>){ drawScope.drawIntoCanvas{ val step = xAxisLength / maxPointCount val shadowPath = Path() shadowPath.moveTo(0f.toX, 0f.toY) for (i in dataList.indices) { ... } shadowPath.close() it.drawPath(shadowPath, paintTablePath) it.drawPath(shadowPath, paintTableBorder) } } val paintTablePath = Paint().also { it.isAntiAlias = true it.style = PaintingStyle.Fill it.strokeWidth = 1f it.color = Color(0xffdfecfe) } val paintTableBorder = Paint().also { it.isAntiAlias = true it.style = PaintingStyle.Stroke it.strokeWidth = 3f it.color = Color.Red }
效果图A

回答
做不到。原生drawPath单次调用只会应用传入的单个Paint对象的全部样式配置,你需要的填充、描边效果对应不同的颜色、绘制模式、线宽参数,这些互斥的配置没法合并到同一个Paint中生效。
你现在两次调用drawPath的写法本身就是图形绘制的标准实现,不存在性能问题:两次调用复用同一个预计算好的Path对象,没有额外的路径计算开销,GPU会自动对这两个同路径的绘制操作做批处理,渲染效率很高。
如果觉得连续写两次drawPath太冗余,可以自己封装一层扩展方法,把两次绘制逻辑包装起来,对外暴露单次调用的接口即可,示例如下:
fun Canvas.drawPathWithFillAndStroke( path: Path, fillPaint: Paint, strokePaint: Paint ) { // 注意绘制顺序:先画填充再画描边,否则描边会被填充覆盖一半宽度 drawPath(path, fillPaint) drawPath(path, strokePaint) }
不要为了强行实现"单次调用drawPath"去走歪路,比如反复修改同一个Paint的style属性做两次绘制,本质和你现在的实现没有区别,还平白增加了Paint状态切换的开销,甚至可能出现描边层级错误、边缘锯齿异常的问题,完全没必要。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

