微信小程序canvas开发的一些坑和总结-持续更新

一,新版的canvas和旧版不同,需要增加type=2d,且初始化不一样

第一步是html中修改

c 复制代码
<canvas canvas-id="myCanvas" />
<!-- 修改为以下 -->
<canvas id="myCanvas" type="2d" />

第二步是初始化变了

c 复制代码
const context = wx.createCanvasContext('myCanvas')
//
// 修改为以下
//
wx.createSelectorQuery()
    .select('#myCanvas') // 在 WXML 中填入的 id
    .node(({ node: canvas }) => {
        const context = canvas.getContext('2d')
    })
    .exec()

二,在popup弹窗中使用canvas绘制无效

当canvas重新渲染时,canvas中的内容全部都会被清空。 解决 popup弹出后,不要马上绘制,需要等待popup中的canvas渲染完成后,在调用canvas取绘制就好了!

这是因为新版的canvas绘制是同步的,而canvas的初始化又是异步的,这就导致popup弹窗我们用v-if来创建时,就会发生这个问题.

我的修改:

c 复制代码
showCanvas(){
	this.imgShow=true
	const that=this
	that.$nextTick(()=>{
		// 使用 fabric 绑定画布
		wx.createSelectorQuery()
		    .select('#poster-canvas') // 在 WXML 中填入的 id
		    .fields({ node: true, size: true })
		    .exec((res) => {
		        // Canvas 对象
				const canvasNode = res[0].node
		        // 渲染上下文
				that.context = canvasNode.getContext('2d')
				const dpr = wx.getSystemInfoSync().pixelRatio
				canvasNode.width = res[0].width * dpr
			    canvasNode.height = res[0].height * dpr
			    that.context.scale(dpr, dpr)
				that.context.clearRect(0, 0, that.context.canvas.width, that.context.canvas.height)
				const image = canvasNode.createImage()
				image.src = 'https://open.weixin.qq.com/zh_CN/htmledition/res/assets/res-design-download/icon64_wx_logo.png'
				image.onload = () => {
					console.log("图片加载完成",that.context)
				    that.context.drawImage(
				        image,
				        0,
				        0,
				        150,
				        100,
				    )
					that.context.fillStyle="red"
					that.context.strokeStyle="blue"
					that.context.beginPath()
					that.context.moveTo(10,10)
					that.context.lineTo(60, 10)
					that.context.lineTo(60, 40)
					that.context.closePath()
					that.context.stroke()
					that.context.fill()
					// 这里绘制完成
					console.log('draw done')
				}
				
		})
	})
	
},

也就是放置在nextTick中,等canvas初始化完成后再绘制即可.

相关推荐
郑叔敲代码1 天前
帝国cms 微信小程序的登录逻辑
微信小程序·小程序·notepad++
棋子一名1 天前
跑马灯组件 Vue2/Vue3/uni-app/微信小程序
微信小程序·小程序·uni-app·vue·js
无衣 秦风1 天前
vue3+hubuilderX开发微信小程序使用elliptic生成ECDH密钥对遇到的问题
微信小程序·小程序
游戏开发爱好者81 天前
BShare HTTPS 集成与排查实战,从 SDK 接入到 iOS 真机调试(bshare https、签名、回调、抓包)
android·ios·小程序·https·uni-app·iphone·webview
2501_916008891 天前
iOS 26 系统流畅度实战指南|流畅体验检测|滑动顺畅对比
android·macos·ios·小程序·uni-app·cocoa·iphone
流***陌1 天前
陪诊就医小程序中健康档案的精细化管理设计方案
小程序
明天你好2671 天前
如何做一个花店小程序,搭建一个小程序多少钱
微信小程序·小程序·模拟退火算法
2501_915106321 天前
苹果软件加固与 iOS App 混淆完整指南,IPA 文件加密、无源码混淆与代码保护实战
android·ios·小程序·https·uni-app·iphone·webview
江城开朗的豌豆1 天前
小程序登录不迷路:一篇文章搞定用户身份验证
前端·javascript·微信小程序
2501_915921431 天前
iOS 26 崩溃日志解析,新版系统下崩溃获取与诊断策略
android·ios·小程序·uni-app·cocoa·iphone·策略模式