首页 > 其他分享 >旧版 Canvas 迁移指南

旧版 Canvas 迁移指南

时间:2024-12-24 10:00:46浏览次数:8  
标签:指南 Canvas res canvas context 旧版 绘制 wx

旧版 Canvas 迁移指南

小程序的 旧版 canvas 接口 已经不再维护,本指南将指引如何迁移至新版 Canvas 2D 接口

特性差异

旧版 canvas 接口 Canvas 2D 接口
同层渲染 不支持 支持
api支持 部分支持 支持全部 Web 标准
绘制 异步绘制 同步绘制
性能

迁移步骤

第一步:修改 WXML

<canvas canvas-id="myCanvas" />
<!-- 修改为以下 -->
<canvas id="myCanvas" type="2d" />

旧版 canvas 接口使用 canvas-id 属性唯一标识 canvas;新版 Canvas 2D 可直接使用 id 标识。

另外需要给 canvas 添加 type="2d" 属性标识为新版 Canvas 2D 接口。

第二步:修改获取 CanvasContext

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

旧版 canvas 接口使用 wx.createCanvasContext 同步获取 CanvasContext

新版 Canvas 2D 接口需要先通过 SelectorQuery 异步获取 Canvas 对象,再通过 Canvas.getContext 获取渲染上下文 RenderingContext

第三步:画布大小初始化

// 旧版 canvas 不能修改宽高
wx.createSelectorQuery()
    .select('#myCanvas') // 在 WXML 中填入的 id
    .fields({ node: true, size: true })
    .exec((res) => {
        // Canvas 对象
        const canvas = res[0].node
        // Canvas 画布的实际绘制宽高
        const renderWidth = res[0].width
        const renderHeight = res[0].height
        // Canvas 绘制上下文
        const ctx = canvas.getContext('2d')

        // 初始化画布大小
        const dpr = wx.getWindowInfo().pixelRatio
        canvas.width = renderWidth * dpr
        canvas.height = renderHeight * dpr
        ctx.scale(dpr, dpr)
    })

旧版 canvas 接口的画布大小是根据实际渲染宽度决定的,开发者无法修改。

新版 Canvas 2D 接口允许开发者自由修改画布的逻辑大小,默认宽高为 300*150。

不同的设备上,存在物理像素和逻辑像素不相等的情况,所以一般我们需要用 wx.getWindowInfo 获取设备的像素比,乘上 canvas 的实际大小。

第四步:修改绘制方法

// 若干绘制调用
context.fillRect(0, 0, 50, 50)
context.fillRect(20, 20, 50, 50)

context.draw(false, () => {
    // 这里绘制完成
    console.log('draw done')
})

//
// 修改为以下
//

// 绘制前清空画布
context.clearRect(0, 0, canvas.width, canvas.height)
// 若干绘制调用
context.fillRect(0, 0, 50, 50)
context.fillRect(20, 20, 50, 50)

// 这里绘制完成
console.log('draw done')

旧版 canvas 接口绘制需要调用 CanvasContext.draw 才会进行绘制,并且绘制过程是异步的,需要等待绘制完成回调才能进行下一步操作。

新版 Canvas 2D 接口不再需要调用 draw 函数,所有绘制方法都会同步绘制到画布上。

需要注意的是 CanvasContext.draw 函数第一个参数控制在绘制前是否保留上一次绘制(默认值为 false,即不保留),若设置为 false,则迁移至新接口后,需要在绘制前通过 clearRect 清空画布。

第五步:修改图片绘制

context.drawImage(
    'https://open.weixin.qq.com/zh_CN/htmledition/res/assets/res-design-download/icon64_wx_logo.png',
    0,
    0,
    150,
    100,
)
//
// 修改为以下
//
const image = canvas.createImage()
image.onload = () => {
    context.drawImage(
        image,
        0,
        0,
        150,
        100,
    )
}
image.src = 'https://open.weixin.qq.com/zh_CN/htmledition/res/assets/res-design-download/icon64_wx_logo.png'

旧版 canvas 接口 CanvasContext.drawImage 直接传入图片 url 进行绘制。

新版 Canvas 2D 接口需要先通过 Canvas.createImage 创建图片对象,onload 图片加载完成回调触发后,再将图片对象传入 context.drawImage 进行绘制。

其余接口调整

wx.canvasToTempFilePath

wx.canvasToTempFilePath({
    canvasId: 'myCanvas',
    success(res) {
        //
    }
})
//
// 修改为以下
//
wx.canvasToTempFilePath({
    canvas: canvas,
    success(res) {
        //
    }
})

旧版 canvas 接口传入 canvas-id

新版 Canvas 2D 接口需要直接传入 Canvas 实例

wx.canvasPutImageData

wx.canvasPutImageData({
    canvasId: 'myCanvas',
    x: 0,
    y: 0,
    width: 1,
    height: 1,
    data: data,
    success (res) {
        // after put image data
    }
})
//
// 修改为以下
//
const context = canvas.getContext('2d')
context.putImageData(data, 0, 0, 0, 0, 1, 1)
// after put image data

新版 canvas 不支持 wx.canvasPutImageData,应使用 context.putImageData 代替。

wx.canvasGetImageData

wx.canvasGetImageData({
    canvasId: 'myCanvas',
    x: 0,
    y: 0,
    width: 100,
    height: 100,
    success(res) {
        console.log(res.width) // 100
        console.log(res.height) // 100
        console.log(res.data instanceof Uint8ClampedArray) // true
        console.log(res.data.length) // 100 * 100 * 4
    }
})
//
// 修改为以下
//
const context = canvas.getContext('2d')
const imageData = context.getImageData(0, 0, 100, 100)
console.log(imageData.width) // 100
console.log(imageData.height) // 100
console.log(imageData.data instanceof Uint8ClampedArray) // true
console.log(imageData.data.length) // 100 * 100 * 4

新版 canvas 不支持 wx.canvasGetImageData,应使用 context.getImageData 代替。

wx.loadFontFace

wx.loadFontFace({
  family: 'Bitstream Vera Serif Bold',
  source: 'url("https://sungd.github.io/Pacifico.ttf")',
  success: console.log
})
//
// 修改为以下
//
wx.loadFontFace({
  family: 'Bitstream Vera Serif Bold',
  source: 'url("https://sungd.github.io/Pacifico.ttf")',
  scopes: ['webview', 'native'],
  success: console.log
})

新版 Canvas 2D 接口需要为 scopes 设置 native

标签:指南,Canvas,res,canvas,context,旧版,绘制,wx
From: https://www.cnblogs.com/AtlasLapetos/p/18623947

相关文章

  • Canvas 画布
    Canvas画布canvas组件提供了绘制界面,可以在之上进行任意绘制基础使用第一步:在WXML中添加canvas组件<!--2d类型的canvas--><canvasid="myCanvas"type="2d"style="border:1pxsolid;width:300px;height:150px;"/>首先需要在WXML中添加canvas组件。......
  • SharpDX 从入门到精通:全面学习指南
    摘要: 本文旨在为想要深入学习SharpDX的开发者提供一份全面的指南。从SharpDX的基础概念入手,逐步深入探讨其在不同场景下的应用,包括图形渲染、音频处理等,并结合大量详细的代码案例帮助读者更好地理解和掌握SharpDX的使用方法,最终达到能够熟练运用SharpDX进行复杂项目开......
  • 京东商品详情数据接口(JD.item_get)丨京东API接口指南
    京东商品详情数据接口(JD.item_get)是京东开放平台为开发者提供的重要服务,以下是相关介绍:功能作用获取商品基本信息:包括商品ID、标题、价格、库存量、库存状态、商品链接等,为商品展示和销售管理提供基础数据.查看商品详情描述:涵盖图片、规格参数、包装清单、售后服务等,帮助用......
  • 掌握 SQL SELECT 语句:综合指南
    SQLSELECT语句基础1.基本语法SELECT语句用于从数据库中的一个或多个表中检索数据。其基本语法如下:SELECTcolumn1,column2,...FROMtable_name;其中,column1,column2,...是你想要检索的列的名称。可以选择一个或多个列,也可以使用*来选择所有列。table_name是你要从中......
  • Easysearch Java SDK 2.0.x 使用指南(二)
    在上一篇文章中,我们介绍了EasysearchJavaSDK2.0.x的基本使用和批量操作。本文将深入探讨索引管理相关的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版SDK提供的同步和异步两种调用方式。SDK的对象构建有两种方式1.传统的Builder方式最基础的方式,像这......
  • Linux初学者的全面指南(四):shell编程(下)
    目录一、表达式与运算符1.表达式2.运算符  二、流程控制语句1.多命令组合 2.分支结构三、函数 1.定义与调用2.参数3.定义与调用4.返回值 总结一、表达式与运算符1.表达式算术表达式bash自身并不支持简单的数学运算,但可通过awk和expr等命令来实现数学......
  • springboot毕设苏州旅游指南网站论文+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着人们生活水平的提高和旅游业的蓬勃发展,旅游已经成为人们休闲娱乐的重要方式之一。苏州作为中国著名的历史文化名城和旅游胜地,拥有丰富的旅游......
  • APP 渗透测试指南(一)--- 安卓测试环境部署(超级详细)(成为移动黑客,手机kali安装最简单教
    绪论如果各位师傅觉得有用的话,可以给我点个关注~~如果师傅们有什么好的建议也欢迎联系我~~感谢各位师傅的支持~~投票   不好意思各位师傅,最近断更了好久,工具太多了写不过来了,后续会继续保持更新!!!想麻烦各位师傅进行一下投票,后续会优先更新投票数量最多的内容! ......
  • 免费的10款高效项目管理软件——2024年最新选择指南
    随着技术的进步,项目管理工具也在不断演变和改进,为团队提供更高效、更具协作性和更加便捷的管理解决方案。在2024年,有许多免费且高效的项目管理软件值得推荐。本文将介绍十款热门的免费项目管理软件,帮助您找到最适合自身需求的工具。一、引言在当今的商业环境中,高效的项目管理......
  • Ai翻译软件大对决:九款Ai翻译神器深度剖析与选型指南,建议收藏
    在当今这个全球化与互联网深度交融的时代,语言的隔阂曾是人们交流、学习以及工作娱乐时面临的一大阻碍,而AI翻译软件的出现,就如同点点星光,照亮了跨越这些障碍的道路,成为了大家生活中极为重要的帮手。今天,咱们就一起走进九款颇具代表性的AI翻译软件,去好好了解一下它们各自的独......