画圆角矩形遇到的诡异问题

画圆角矩形,其实就是画4段直线加4个转角的曲线。我用如下代码,描边圆角矩形正常,但填充时效果怪异。不知为何?



我猜,会不会和使用的方法有关,有可能一种方法是抬笔的一种是不抬笔的。因为看你下面那个图,内部的连线都是在画完圆角之后出现,并不是没有规律。

我跟你一模一样!
在canvas画,正常,
在cocos里画,stroke是正常, fill就有问题

坐标:

结果:
image

代码

static path(ctx: Graphics, width: number, height: number, r1: number, r2: number) {

    // ctx.beginPath()

    // ctx.moveTo(-width / 2, height / 2 - r1)

    // 左上角圆弧: 从pi->0.5pi 顺时针

    ctx.arc(r1, height - r1, r1, Math.PI, 0.5 * Math.PI, false)

    // 上边的横线

    ctx.lineTo(width - r2, height)

    // 右上角圆弧: 从0.5pi->0pi 顺时针

    ctx.arc(width - r2, height - r2, r2, 0.5 * Math.PI, 0 * Math.PI, false)

    // // 右边的横线

    ctx.lineTo(width, r2)

    // // 右下角圆弧: 从0pi->-0.5pi 顺时针

    ctx.arc(width - r2, r2, r2, 0 * Math.PI, -0.5 * Math.PI, false)

    // // 下边的横线

    ctx.lineTo(r1, 0)

    // 左下角圆弧: 从-0.5pi->-1.0pi 顺时针

    ctx.arc(r1, r1, r1, -0.5 * Math.PI, - Math.PI, false)

    // // 左边的横线

    ctx.lineTo(0, height - r1) // 这里可以不写,因为后面closePath了

    ctx.close()

    ctx.fill()

}

官方有没有解决呢?
感觉像是arc方法用在fill时, 画面先封闭了!

每一个lineTo后面都手动接一句ctx.lineTo(width / 2, height / 2);

多谢,已经解决了。 最终是参考了官方源码里的roundRect方法来实现的。

最近打算自己做一个无资源的游戏,纯手工画线,也遇到这个问题了。我是倒圆角后自己填充的三角形然后填充三个矩形来处理的,效果勉强还行


GIF 2021-3-31 10-02-04

看了下源码,大概逻辑应该是这样。
目前graphics组件的画图逻辑是先使用moveTo()创建一个路径path数组,然后通过lineTo()、bezierCurveTo()等方法绘制关键点并保存到path中,最后fill()的时候通过path中的点进行绘制。
你们的思路都是正确的,理论上就该这样绘制,关键问题就是arc()方法会调用一次moveTo()将点重置到要弧线的起始点,所以就导致每次调用arc()都是一个新的path,最后总共生成了4个path,每个path绘制的图形就是弧线加边形成的包围图形。
解决办法1:修改源码,将arc()方法中的moveTo()修改为lineTo(),最后生成一个path并绘制完整图形。
解决办法2:将整个绘制分为8个块,也就是8个path。首先定一个起点,比如矩形中心点。分别绘制:1、左上弧线和起点的包围图形;2、上边和起点形成的包围图形;3、右上弧线和起点的包围图形;4、右边和起点形成的包围图形;5、右下弧线和起点的包围图形;6、下边和起点形成的包围图形;7、左下弧线和起点的包围图形;8、左边和起点形成的包围图形;