HaaS UI小程序解决方案进阶教学之一:Canvas画图入门

简介: canvas的应用场景非常多,主要运用在一些需要操作图形的场景,如绘制曲线、特效、粒子特效、图表、游戏、二维码、条形码等等场景。

名词解释

AliOS Things: 阿里云智能IoT团队自研的物联网操作系统

HaaS:全称是Hardware as a Service,阿里云智能IoT团队基于AliOS Things系统推出的硬件即服务

HaaS UI:全称是Hardware as a Service User Interface,是源自AliOS Things操作系统上的一套应用&图形解决方案,支持C/C++和 JS两种开发语言

Canvas组件

在H5里面,canvas就是一个标签,是一个有特殊功能的标签,实际上它是一个画布,我们可以在这个画布上填各种图形元素,甚至可以操作画布上的每一个像素点。在HaaS UI中,也根据H5中canvas相关的api,内置了一个高性能的canvas组件。关于canvas的api,可参阅:w3c规范,HaaS UI支持了该规范下的大部分api。

1、用途

canvas的应用场景非常多,主要运用在一些需要操作图形的场景,如绘制曲线、特效、粒子特效、图表、游戏、二维码、条形码等等场景。

2、开始

在HaaS UI中使用canvas,只需要以下3个步骤即可:

  1. 在template中添加canvas标签
  2. 在组件挂载之后,比方mounted生命周期函数中,获取canvas的上下文环境
  3. 调用context的api进行绘图操作

示例

  <div class="page">
    <canvas ref="canvas" class="canvas" />
  </div>
</template>
<script>
export default {
  mounted() {
    // 获取canvas context
    let ctx = createCanvasContext(this.$refs.canvas);
    // 绘制红色矩形
    ctx.fillStyle = 'red';
    ctx.fillRect(10, 10, 50, 50);
  },
};
</script>
<style scoped>
.page {
  flex: 1;
  align-items: center;
}
.canvas {
  border-style: solid;
  border-color: #666;
  border-width: 1px;
  background-color: #ccc;
  margin-top: 10px;
}
</style>

image.png

画一朵小花

let ctx = createCanvasContext(this.$refs.canvas);
// 花瓣1
ctx.beginPath();
ctx.arc(100,20,20,0,2*Math.PI);
ctx.fillStyle = 'red';//填充样式
ctx.fill();
// 花瓣2
ctx.beginPath();
ctx.arc(140,20,20,0,2*Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
// 花瓣3
ctx.beginPath();
ctx.arc(100,60,20,0,2*Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
// 花瓣4
ctx.beginPath();
ctx.arc(140,60,20,0,2*Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
//绘制花蕊圆心(120,40)
ctx.beginPath();
ctx.arc(120,40,20,0,2*Math.PI);
ctx.fillStyle = 'yellow';
ctx.fill();
//花径
ctx.beginPath();
ctx.moveTo(120,60);
ctx.quadraticCurveTo(125,130,100,150);//贝塞尔曲线
ctx.stroke();

image.png

3、canvas api

颜色、样式

接口 类型 描述 备注
fillStyle Color/Gradient 设置填充绘画的样式 ctx.fillStyle="white"|grad
strokeStyle Color/Gradient 设置线条绘画的样式 ctx.strokeStyle="white"|grad
createLinearGradient() function 创建线性渐变(用在画布内容上) ctx.createLinearGradient(x0,y0,x1,y1); x0: 渐变开始点的 x 坐标; y0: 渐变开始点的 y 坐标; x1: 渐变结束点的 x 坐标; y1: 渐变结束点的 y 坐标
createRadialGradient() function 创建放射状/环形的渐变(用在画布内容上) ctx.createRadialGradient(x0,y0,r0,x1,y1,r1); x0: 渐变开始圆的 x 坐标; y0: 渐变开始圆的 y 坐标; r0: 开始圆的半径; x1: 渐变结束圆的 x 坐标; y1: 渐变结束圆的 y 坐标; r1: 结束圆的半径
addColorStop() function 规定渐变对象中的颜色和停止位置 grad.addColorStop(stop,color); stop: 介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置。 color: 在结束位置显示的 CSS 颜色值

线条样式

接口 类型 描述 备注
lineWidth number 设置线条宽度,单位px ctx.lineWidth=5
lineCap Enum 设置线条的结束线帽样式 ctx.lineCap='butt|round|square'
lineJoin Enum 设置线条交叉的拐角样式 ctx.lineJoin='bevel|round|miter'
miterLimit number 设置最大斜接长度,lineJoin=miter时生效 ctx.miterLimit=10

矩形

接口 类型 描述 备注
rect() function 创建矩形 ctx.rect(0,0,100,100)
fillRect() function 填充矩形 ctx.fillRect(0,0,100,100)
strokeRect() function 绘制矩形(无填充) ctx.strokeRect(0,0,100,100)
clearRect() function 清除矩形像素 ctx.clearRect(0,0,100,100)

路径

接口 类型 描述 备注
fill() function 填充当前路径 ctx.fill()
stroke() function 绘制当前路径(无填充) ctx.stroke()
beginPath() function 开始或重置一条路径 ctx.beginPath()
closePath() function 关闭路径(从当前点到起始点) ctx.closePath()
moveTo() function 把路径移动到画布中的指定点,不创建线条 ctx.moveTo(100,100)
lineTo() function 添加一个新点,然后在画布中创建从该点到最后指定点的线条 ctx.lineTo(100,200)
clip() function 从原始画布剪切当前路径尺寸的区域 ctx.clip()
quadraticCurveTo() function 创建二次贝塞尔曲线 ctx.quadraticCurveTo(cpx,cpy,x,y); cpx: 控制点的 x 坐标; cpy: 控制点的 y 坐标; x: 结束点的 x 坐标; y: 结束点的 y 坐标
bezierCurveTo() function 创建三次贝塞尔曲线 ctx.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y); cp1x: 第一个控制点的 x 坐标; cp1y: 第一个控制点的 y 坐标; cp2x: 第二个控制点的 x 坐标; cp2y: 第二个控制点的 y 坐标; x: 结束点的 x 坐标; y: 结束点的 y 坐标;
arc() function 创建弧/曲线(用于创建圆形或部分圆) ctx.arc(x,y,r,sAngle,eAngle) x: 圆的中心的 x 坐标。 y: 圆的中心的 y 坐标。 r: 圆的半径。 sAngle: 起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。 eAngle: 结束角,以弧度计。
arcTo() function 创建两切线之间的弧/曲线 ctx.arcTo(x1,y1,x2,y2,r) x1: 弧的起点的 x 坐标。 y1: 弧的起点的 y 坐标。 x2: 弧的终点的 x 坐标。 y2: 弧的终点的 y 坐标。 r: 弧的半径。

转换

接口 类型 描述 备注
scale() function 缩放当前绘图至更大或更小 ctx.scale(0.5,0.5)
rotate() function 旋转当前绘图 ctx.rotate(angle) angle: 旋转弧度
translate() function 平移当前绘图 ctx.translate(10,10)
transform() function 替换绘图的当前转换矩阵 ctx.transform(a,b,c,d,e,f); a: 水平缩放绘图; b: 垂直倾斜绘图; c: 水平倾斜绘图; d: 垂直缩放绘图; e: 水平移动绘图; f: 垂直移动绘图
setTransform() function 将当前转换重置为单位矩阵。然后运行transform() ctx.setTransform(a,b,c,d,e,f)

文本

接口 类型 描述 备注
font String 设置当前文字样式 ctx.font="font-style font-weight font-size"; font-style: normal/italic(可选); font-weight: normal/bold(可选); font-size: 字号,像素单位
fillText() function 在画布上绘制“被填充的”文本 ctx.fillText(text,x,y,maxWidth); text: 文本字符串; x: 开始绘制文本的 x 坐标位置; y: 开始绘制文本的 y 坐标位置; maxWidth: 可选。允许的最大文本宽度,以像素计。
strokeText() function 在画布上绘制文本(无填充) ctx.strokeText(text,x,y,maxWidth); 同fillText
measureText() function 返回包含指定文本宽度的对象 ctx.measureText(text).width text: 要测量的文本字符串 result: width 测量的文本宽度

图像

接口 类型 描述 备注
drawImage function 向画布上绘制图像 ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height) img: 要使用的图像(image标签) sx: 可选。开始剪切的 x 坐标位置。 sy: 可选。开始剪切的 y 坐标位置。 swidth: 可选。被剪切图像的宽度。 sheight: 可选。被剪切图像的高度。 x: 在画布上放置图像的 x 坐标位置。 y: 在画布上放置图像的 y 坐标位置。 width: 可选。要使用的图像的宽度。(伸展或缩小图像) height: 可选。要使用的图像的高度。(伸展或缩小图像)

像素操作

接口 类型 描述 备注
createImageData function 创建新的、空白的 ImageData 对象 ctx.createImageData(width,height)
getImageData() function 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 ctx.getImageData(x,y,width,height)
putImageData() function 把图像数据(从指定的 ImageData 对象)放回画布上 ctx.putImageData(imgData,x,y) x: ImageData 对象左上角的 x 坐标,以像素计。 y: ImageData 对象左上角的 y 坐标,以像素计。

合成

接口 类型 描述 备注
globalAlpha Number 设置当前透明值,全局生效 ctx.globalAlpha=0.5
globalCompositeOperation Enum 设置混合模式,新图像如何绘制到已有的图像上 ctx.globalCompositeOperation="source-over|source-atop|source-in|source-out|destination-over|destination-atop|destination-in|destination-out|lighter|copy|xor"; source-over: 默认值,在目标图像上显示源图像。

其他

接口 类型 描述 备注
save() function 保存当前环境的状态 ctx.save()
restore() function 返回之前保存过的路径状态和属性 ctx.restore()

4、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

image.png

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

相关文章
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
753 1
|
2月前
|
存储 JSON 小程序
微信小程序入门之新建并认识小程序结构
微信小程序入门之新建并认识小程序结构
60 1
|
29天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
在鸿蒙应用开发中,Canvas 组件不仅用于基础绘图,还提供了处理复杂路径和渐变效果的多种手段,帮助开发者实现精美的静态图形。本篇将介绍如何在 Canvas 中绘制复杂路径、创建渐变填充效果。
52 7
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
|
29天前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
在鸿蒙应用中,Canvas 组件可以实现丰富的动态效果,适合用于动画和实时更新的场景。本篇将介绍如何在 Canvas 中实现动画循环、动态进度条、旋转和缩放动画,以及性能优化策略。
54 6
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
97 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
29天前
|
人工智能 小程序 搜索推荐
uni app下开发AI运动小程序解决方案
本文介绍了在小程序中实现AI运动识别的解决方案。该方案依托于UNI平台,通过高效便捷的插件形式,实现包括相机抽帧控制、人体识别、姿态识别等在内的多项功能,无需依赖后台服务器,大幅提高识别效率和用户体验。方案内置多种运动模式,支持自定义扩展,适用于AI健身、云上赛事、AI体测等多场景,适合新开发和存量改造项目。
|
1月前
|
小程序 机器人 开发者
QQ 小程序已发布,但无法被搜索的解决方案
我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。
46 2
|
2月前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
255 1
|
2月前
|
机器学习/深度学习 人工智能 JSON
微信小程序原生AI运动(动作)检测识别解决方案
近年来,疫情限制了人们的出行,却推动了“AI运动”概念的兴起。AI运动已在运动锻炼、体育教学、线上主题活动等多个场景中广泛应用,受到互联网用户的欢迎。通过AI技术,用户可以在家中进行有效锻炼,学校也能远程监督学生的体育活动,同时,云上健身活动形式多样,适合单位组织。该方案成本低、易于集成和扩展,已成功应用于微信小程序。
|
2月前
|
前端开发 小程序 JavaScript
小程序 canvas 生成海报 一次搞掂
小程序 canvas 生成海报 一次搞掂
34 1