微信小程序 canvas圆角矩形的绘制

微信小程序允许对普通元素通过 border-radius的设置来进行圆角的绘制,但有时候在使用 canvas绘图的时候,也需要圆角,例如需要将页面上某块区域导出为图片下载到本地的时候,常用的解决方法就是使用 canvas将这块区域绘制出来,最后导出 canvas即可,但是 canvas没有直接提供圆角的绘制 api,所以需要 曲线救国


圆角矩形与一般矩形的区别在于,前者的四个角都是圆弧,所以只需要将一般矩形的四个角切掉,换成圆弧即可,如下图就是一个一般矩形被切掉了四个角的样子:

这里写图片描述

很明显,切掉了四个角的矩形,剩下其实就是四条 line,既然如此,完全可以跳过绘制矩形然后切角这一步,因为切角的结果就是四条边(line),直接绘制四条边即可。
然后在每两条边的缺角处绘制弧度为 0.5 * Math.PI 的圆弧,最后这四条边与四个圆弧所封闭的图形就是圆角矩形:
这里写图片描述

原理知道了,代码就很好写了,这里只说几个注意点:

  • 封闭图形的 fillStyle颜色设置为 transparent

想将封闭路径的图形绘制下来,需要调用 strokefill方法,默认 strokefill

### 实现微信小程序 Canvas 绘制圆角矩形框的方法 在微信小程序中,Canvas 没有直接提供绘制圆角矩形的 API,因此需要通过组合绘制直线和圆弧来实现。以下是实现圆角矩形框的详细方法。 #### 方法原理 圆角矩形绘制思路是基于 Canvas 提供的 `arc` 和 `lineTo` 函数,通过组合四个和四段圆弧来实现。具体步骤如下: 1. **确定矩形的四个**:每个需要绘制一个 90° 的圆弧。 2. **绘制边与连接圆弧**:使用 `lineTo` 绘制矩形的四条边,并通过 `arc` 绘制四个的圆弧。 3. **闭合路径**:最后闭合路径并填充或描边。 #### 示例代码 以下是一个完整的绘制圆角矩形的方法: ```javascript /** * 绘制圆角矩形框 * @param {Object} ctx - canvas 的绘图上下文 * @param {Number} x - 矩形左上 x 坐标 * @param {Number} y - 矩形左上 y 坐标 * @param {Number} w - 矩形宽度 * @param {Number} h - 矩形高度 * @param {Number} r - 圆半径 * @param {String} [strokeColor = '#000'] - 描边颜色 */ function drawRoundedRect(ctx, x, y, w, h, r, strokeColor = '#000') { // 限制圆半径,防止超出矩形尺寸 if (w < 2 * r) r = w / 2; if (h < 2 * r) r = h / 2; ctx.beginPath(); ctx.setStrokeStyle(strokeColor); // 左上 ctx.moveTo(x + r, y); ctx.arcTo(x, y, x, y + r, r); // 右上 ctx.lineTo(x + w, y + r); ctx.arcTo(x + w, y, x + w, y + h, r); // 右下 ctx.lineTo(x + w - r, y + h); ctx.arcTo(x + w, y + h, x, y + h, r); // 左下 ctx.lineTo(x + r, y + h); ctx.arcTo(x, y + h, x, y, r); // 闭合路径并描边 ctx.closePath(); ctx.stroke(); } ``` #### 使用示例 在页面的 `onLoad` 生命周期中调用绘制函数: ```javascript onLoad() { const ctx = wx.createCanvasContext('myCanvas'); drawRoundedRect(ctx, 50, 50, 200, 100, 20, '#FF0000'); ctx.draw(); } ``` #### 注意事项 - **兼容性问题**:部分 Android 设备上使用 `arcTo` 时可能出现问题,建议使用 `arc` 和 `lineTo` 的组合来替代 `arcTo` [^5]。 - **性能优化**:在频繁重绘的场景中,建议对绘图上下文进行缓存,避免重复创建和销毁。 - **自定义样式**:可以通过 `setStrokeStyle`、`setLineWidth` 等方法调整边框颜色、宽度等样式。 ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值