详解微信小程序canvas圆角矩形的绘制的方法

发布时间:2020-10-04 18:20:31

来源:脚本之家

阅读:103

作者:清夜

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

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

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

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

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

想将封闭路径的图形绘制下来,需要调用 stroke 或 fill 方法,默认 stroke 或 fill 的颜色是 black ,但是这里有个问题, 圆弧的绘制可能会出现锯齿或者糊边,如果 stroke 或 fill 的颜色,与你所需要绘制的圆角矩形的边缘色调不一致,这种糊边的感觉会比二者色调一致的更明显, 下图第一个为色调一致,第二个为色调不一致的情况:

不过据我观测,只要不是特意放大仔细看,无论是色调是否一致,其实一般人很难注意到糊边的事情

clip

绘制好了圆角选区之后,还需要调用 ctx.clip 方法来裁剪选区

save 与 restore

如果这个矩形选区只是 canvas 画布的一部分,为了避免对后续的影响,最好在 beginPath 之前,将之前的动作 save ,然后画完后再 restore

一个关于 在 canvas 上绘制圆角图片,并下载到本地的可运行示例代码已经放到 github 上了,注释也比较详细,需要的可自取

其中关键代码如下:

/**

*

* @param {CanvasContext} ctx canvas上下文

* @param {number} x 圆角矩形选区的左上角 x坐标

* @param {number} y 圆角矩形选区的左上角 y坐标

* @param {number} w 圆角矩形选区的宽度

* @param {number} h 圆角矩形选区的高度

* @param {number} r 圆角的半径

*/

function roundRect(ctx, x, y, w, h, r) {

// 开始绘制

ctx.beginPath()

// 因为边缘描边存在锯齿,最好指定使用 transparent 填充

// 这里是使用 fill 还是 stroke都可以,二选一即可

ctx.setFillStyle('transparent')

// ctx.setStrokeStyle('transparent')

// 左上角

ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)

// border-top

ctx.moveTo(x + r, y)

ctx.lineTo(x + w - r, y)

ctx.lineTo(x + w, y + r)

// 右上角

ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)

// border-right

ctx.lineTo(x + w, y + h - r)

ctx.lineTo(x + w - r, y + h)

// 右下角

ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)

// border-bottom

ctx.lineTo(x + r, y + h)

ctx.lineTo(x, y + h - r)

// 左下角

ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)

// border-left

ctx.lineTo(x, y + r)

ctx.lineTo(x + r, y)

// 这里是使用 fill 还是 stroke都可以,二选一即可,但是需要与上面对应

ctx.fill()

// ctx.stroke()

ctx.closePath()

// 剪切

ctx.clip()

}

ps:微信小程序canvas把正方形图片绘制成圆形

//index.js

Page({

data: {

image: {

src: "/1.png",

width: 200,

heigth: 200

}

},

onLoad: function () {

let that = this;

var contex = wx.createCanvasContext('firstCanvas')

contex.save(); // 先保存状态 已便于画完圆再用

contex.beginPath(); //开始绘制

//先画个圆

contex.arc(100, 100, 100, 0, Math.PI * 2, false);

contex.clip();//画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内

contex.drawImage(that.data.image.src, 0, 0, that.data.image.width, that.data.image.heigth); // 推进去图片

contex.restore(); //恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 可以继续绘制

contex.draw();

}

})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

用python画圆角矩形_详解微信小程序canvas圆角矩形的绘制的方法相关推荐

  1. canvas 圆角矩形填充_详解微信小程序canvas圆角矩形的绘制的方法

    微信小程序允许对普通元素通过 border-radius 的设置来进行圆角的绘制,但有时候在使用 canvas 绘图的时候,也需要圆角,例如需要将页面上某块区域导出为图片下载到本地的时候,常用的解决方 ...

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

    微信小程序允许对普通元素通过 border-radius的设置来进行圆角的绘制,但有时候在使用 canvas绘图的时候,也需要圆角,例如需要将页面上某块区域导出为图片下载到本地的时候,常用的解决方法就 ...

  3. 微信 html 字体 自动换行,详解微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvascontext.filltext参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  4. 本地缓存需要高时效性怎么办_详解微信小程序缓存--缓存时效性

    关于本地缓存 1.wx.setStorage(wx.setStorageSync).wx.getStorage(wx.getStorageSync).wx.clearStorage(wx.clearS ...

  5. 微信小程序进度条样式_详解微信小程序——自定义圆形进度条

    微信小程序 自定义圆形进度条,具体如下: 无图无真相,先上图: 实现思路,先绘制底层的灰色圆圈背景,再绘制上层的蓝色进度条. 代码实现: JS代码: 页面初始化 options为页面跳转所带来的参数 ...

  6. 微信小程序foreach遍历_详解微信小程序循环及嵌套循环

    本文主要介绍微信小程序 循环及嵌套循环的使用总结的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下,希望能帮助到大家. 对于我们在js中从接口中通过POST或GET请求获取数据存放到Page中 ...

  7. 微信小程序 渲染层网络错误_详解微信小程序「渲染层网络层错误」的解决方法...

    问题描述: 情况是这样的,我需要在小程序中通过image标签显示三张我的图片,毫无疑问,其重点部分肯定在image的src属性上,请看思路分析: 我们可以新建一个专门放图片的文件夹,然后将我们项目所需 ...

  8. 详解微信小程序开发(项目从零开始)

    关注公众号 风色年代(itfantasycc) 280G前端&小程序资料随便拿! 详解微信小程序开发(项目从零开始) 一.序 微信小程序,估计大家都不陌生,现在应用场景特别多.今天就系统的介绍 ...

  9. 详解微信小程序页面间传递信息的三种方式

    详解微信小程序页面间传递信息的三种方式 在开发微信小程序的时候,经常会遇到在页面间传递信息的情况,有三种方法可以实现. 1. 使用数据缓存 将要存储的数据使用以下方法放入缓存 wx.setStorag ...

最新文章

  1. 【文章】本站收集与转载文章目录
  2. 10个最佳Node.js企业应用案例:从Uber到LinkedIn
  3. python画圆形螺旋线_这个Python项目,一秒生成可爱像素风图片
  4. 一个简单问题引发对IEnumerable和IQueryable的思考
  5. php之去掉html标签,PHP删除HTMl标签
  6. 微信小程序项目实战之天气预报
  7. 并发 锁和隔离等级的关系
  8. 报表工具选型对比系列 - 多源关联性能
  9. Windows server 2008 密码策略不能修改的解决办法
  10. mysql使用什么语句为指定_在MySQL中,可以使用_____语句来为指定数据库添加用户。...
  11. binlog2sql 恢复工具使用
  12. Android权限管理原理(含6.0)
  13. 公众号被 SRS 大佬推荐是怎么样一种体验~~
  14. 用python设计一个简易的英汉互译界面_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...
  15. R语言灰色关联分析法
  16. 生活记录--虽然没有扶着墙进,基本扶着墙出
  17. 方太:以“一”解“套”
  18. git 命令回退到上次
  19. .NET绘制旋转太极图
  20. 好的Firefox插件推荐

热门文章

  1. PPT——增加撤销次数
  2. PR学习笔记——效果控件的相关知识
  3. HTML5期末大作业:管理系统网站设计——蓝色OA企业员工管理系统(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源
  4. 【专题5: 硬件设计】 之 【32.案例三:碎纸机,比较器】
  5. 操作系统之哲学原理12----文件原理
  6. Ubuntu18.04——基于X86和Arm安装并配置Realsense-ros环境
  7. emui10如何降级_华为/荣耀手机系统降级,EMUI降级
  8. DIV 浮动层 绝对定位居中浮动 用CSS怎么写 —— 绯色的CSS系列
  9. 手机上安装Linux游戏模拟器,Linux系统上安装ePSXe 1.6.0游戏模拟器
  10. hang计算机术语大全,计算机词汇