微信小程序canvas画布新接口type为2D时drawImage方法的使用以及注意事项
微信小程序canvas画布自2.9.0 起支持一套新 Canvas 2D 接口(需指定 type 属性),但文档不全,从原canvas的api转变到新的api时遇到不少问题,现将新版与旧版的画布载入图片方法整理一下,避免再次入坑。
旧版代码如下
<canvas style="width:100vw; height:100vh;" canvas-id="canvas_box" ></canvas>
onReady() {
let ctx = wx.createCanvasContext("canvas_box");
ctx.drawImage("../../assets/img/cat.jpg", 0, 0);
ctx.draw();
}
新版注意事项:
- 需指定canvas组件的type属性为2d,如果指定了此属性,则canvas-id属性无需指定;
- 通过获取元素节点的方式获取canvas对象:wx.createSelectorQuery().select(’#canvas_box’),如果是在自定义组件 component 内,则需要加in获取:wx.createSelectorQuery().in(this).select(’#canvas_box’);
- Canvas 2D(新接口)需要显式设置画布宽高 (默认为 300x150);
- 旧版的drawImage方法的第一个参数是图片路径,为字符串如:"…/…/assets/img/cat.jpg",新版的api同web一致,需是这些类型:HTMLImageElement、HTMLCanvasElement、ImageBitmap等,详情可参见这里CanvasRenderingContext2D.drawImage() 和 CanvasImageSource ;
- drawImage方法需要放在图片img的onload方法里面执行;
- 如果需要向canvas里载入多张图片,则需要分别创建多个img对象。
新版代码如下
wxml:
<view class="content">
<canvas type="2d" disable-scroll="true" id="canvas_box" class="canvas_box"></canvas>
</view>
wxss:
.content {
padding: 20rpx;
}
.canvas_box {
width: 100%;
height: 50vh;
border: 1px dashed #ddd;
}
javascript:
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
const query = wx.createSelectorQuery()
query.select('#canvas_box')
.fields({
id: true,
node: true,
size: true
})
.exec(this.init.bind(this));
},
init(res) {
const canvas = res[0].node
const ctx = canvas.getContext('2d')
const dpr = wx.getSystemInfoSync().pixelRatio
//新接口需显示设置画布宽高;
canvas.width = res[0].width * dpr
canvas.height = res[0].height * dpr
ctx.scale(dpr, dpr);
this.setData({
canvas,
ctx
});
this.canvasDraw();//向画布载入图片的方法
console.log(res)
},
canvasDraw() {
let img = this.data.canvas.createImage();//创建img对象
//如果需要向canvas里载入多张图片,则需要分别创建多个img对象
//let img2=this.data.canvas.createImage();
// img2.οnlοad=()=>{};
// img2.src="";
img.onload = () => {
//img.complete表示图片是否加载完成,结果返回true和false;
console.log(img.complete);//true
this.data.ctx.drawImage(img, 0, 0, this.data.canvas._width, this.data.canvas._height);
};
img.src = "../../assets/img/cat.jpg";
console.log(img.complete);//false
},
获取的canvas组件的节点信息返回的是一个数组,如下图:
智能推荐
小程序Canvas使用及注意事项
前言 公司的小程序项目已经成功上线,这期间也踩过不少坑,影响最深刻的就是canvas,做过海报分享的童鞋应该都懂,微信小程序本身是不支持分享到朋友圈这种操作的,所以就需要我们自己来实现canvas绘制海报并保存到本地相册,那么接下来就总结一下canvas的使用和本人在写canvas时踩过的一些坑。 初识canvas 关于canvas的描述,官网写的很清楚,我就不在赘述了,直接上图。附上官网链接 h...
微信小程序API详解 & express模拟接口及调用 & 小程序接口调用注意事项
微信小程序API详解 小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。 根据api的名称大体可以分为如下三类 事件监听 API 同步 API 异步 API 微信API基本使用 界面API:加载提示 wx.showLoading wx.hideLoading wx.showToast wx.hideToast 调用后台接口 测试接口 wx...
小程序图片转Base64,方法总结。
小程序图片转base64 前言:看了很多博客,小程序社区也逛了个遍,依然找不到小程序图片在本地转base64的方法,接下来就把所有方法做个总结,作为一个野生程序员,好东西绝对要分享。 第一种方法 先上代码 代码看起来似乎没有问题,but~~~~~,人家微信根本就没提供 FileReader()这个方法,所以,这个方法在小程序这里,直接pass掉就行了,不可行。 第二种方法 这个方法很好,代码也是最...
LC 剑指 Offer 36. 二叉搜索树与双向链表
LC 剑指 Offer 36 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱...
HDU5758(Explorer Bo 最小链覆盖的 所有链的长度总和最小 树上链dp)
题目 题意: 给你1颗树。起点可以在n个点之间任意选择。每次走到头了,转方向或切换到另一个点都花费1个魔法。它想把n-1条道路都经过一遍,但是想花费魔法的次数最少。问最少情况下它走路最短是多少。 思路: 首先,一棵树的叶子节点的个数不管以谁为根都是一样的。假如这颗树的叶子节点个数是num。1.num是偶数 那么它使用的魔法次数最少就是num/2,叶子节点两两结合形成链。 2.num是奇数。使用的魔...
猜你喜欢
redis集群
redis集群 需求来源:一台服务器不能满足开发; 注意:集群往往都伴随着分布式 集群:简单理解就是很多台服务器共同实现同一个业务 集群和分布式概述 分布式:将不同的业务分布在不同的地方;比如按照服务类型就有 web应用和数据库;按照功能模块分为 xx(采购)模块和xx(订单)模块; 集群提供了以下两个关键特性: 1、可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从...
Express初始化一个项目&git提交一个项目
安装Express Express 是node.js上最流行的web开发框架,正如他的名字一样,使用他我们可以快速的开发一个web应用,我们用exxpress来搭建: 安装express命令行工具,使用它我们可以初始化一个express项目 创建一个项目: 然后根据提示(如上图),我们输入如下命令: 他会下载项目所依赖的包 然后接着输入: 最后访问一下: 提交一个项目 打开项目所在目录然后进入sh...
linux服务器某些第三方接口可以ping 通但是没有返回数据的原因
今天测试提了一个bug,查询第三方接口的天气接口一直没有数据返回、我当时一直以为是自己的代码问题。在代码的地方打了断点 , 服务器日志一直是开始发送请求,却没有报错,也没有返回数据 接下来是个get请求 在本地,可以有返回的数据,但是在服务器上面就是没有返回 这个是在服务器ping 的状态,是可以ping通的 一直卡着没有数据返回。。。。。 但是使用curl -v 去请求的时候一直没有返回 但是其...
第九课 常见的二叉树:平衡二叉树之红黑树
第九章 常见的二叉树:平衡二叉树之红黑树 1 背景 2 定义 3 红黑树与AVL树对比 4 树结构调整 5 代码实现 5.1 红黑树的插入 5.2 红黑树的删除 5.3 具体代码实现 1 背景 对于二叉排序树,时间复杂度最差时候会是 O(n),比如插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行。为了改变排序二叉树存在的不足,Rudolf Bayer 在 1972...
rocketmq quick start
rocketmq里面的角色: rocketmq里面有nameserver,master,broker三种角色 producer(生产者,生产者代码需要自己编写)和consumer(消费者,消费者代码需要自己编写)都需要访问 nameserver,已得知消息存放在的位置,nameserver就相当于分发的作用 master其实也是broker,只是他比较特别,一台master下面可以连着多台brok...
