微信小程序开发—(八)canvas绘制图形

一.小知识

(1).API接口

(2).context 对象的方法列表

二.步骤

wxml中:

<canvas canvas-id="myCanvas" class="myCanvas" ></canvas>

在js文件onLoad: function() {}的方法中开始编写代码

1.创建一个 Canvas 绘图上下文 CanvasContext

     const ctx = wx.createCanvasContext(‘myCanvas‘)

2.们来描述要在 Canvas 中绘制什么内容(绘图描述)

①.样式的描述

       ctx.setFillStyle(‘red‘)
②形状描述:填充矩形,描边矩形,圆,线段等
       ctx.fillRect(10, 10, 150, 75)

3.绘制

      ctx.draw()
三.效果


wxml中:

<canvas canvas-id="myCanvas" class="myCanvas" ></canvas>
(1).绘制矩形:参数都是(起点x1,起点y1,宽度,长度)
①填充矩形
填充颜色:setFillStyle(‘red‘)

填充矩形:ctx.fillRect(10, 10, 150, 75)或是ctx.rect(10, 10, 150, 75)

如果没有填充颜色,则默认是黑色
js文件中
const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.setFillStyle(‘red‘)
ctx.fillRect(10, 10, 150, 75)
ctx.draw()

②描边矩形

描边颜色:ctx.setStrokeStyle(‘red‘)

描边矩形:setFillStroke()

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.setStrokeStyle(‘red‘)
ctx.strokeRect(10, 10, 150, 75)
ctx.draw()

③清除画布上的矩形内容:ctx.clearRect(10, 10, 150, 75)

注意: clearRect 并非画一个白色的矩形在地址区域,而是清空,为了有直观感受,对 canvas 加了一层背景色。

加了一层背景色加了一层背景色

wxml中:

<canvas canvas-id="myCanvas" style="border: 1px solid; background: #123456;"/>

js中:

	onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘);
		ctx.setFillStyle(‘red‘);
		ctx.fillRect(0, 0, 150, 200);
		ctx.setFillStyle(‘blue‘);
		ctx.fillRect(150, 0, 150, 200);
		ctx.clearRect(10, 10, 150, 75);
		ctx.draw();
	}

(2).路径

ctx.moveTo(10, 10):把路径移动到画布中的指定点

ctx.lineTo(110, 60):增加一个新点,然后创建一条从上次指定点到目标点的线

ctx.fill():填充

1.填充

对当前路径中的内容进行填充。默认的填充色为黑色。

Tip: 如果当前路径没有闭合,fill() 方法会将起点和终点进行连接,然后填充。

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.moveTo(10, 10)
ctx.lineTo(100, 10)
ctx.lineTo(100, 100)
ctx.fill()
ctx.draw()

Tip: fill() 填充的的路径是从 beginPath() 开始计算,但是不会将 fillRect() 包含进去。

const ctx = wx.createCanvasContext(‘myCanvas‘)
// begin path
ctx.rect(10, 10, 100, 30)
ctx.setFillStyle(‘yellow‘)
ctx.fill()

// begin another path
ctx.beginPath()
ctx.rect(10, 40, 100, 30)

// only fill this rect, not in current path
ctx.setFillStyle(‘blue‘)
ctx.fillRect(10, 70, 100, 30)

ctx.rect(10, 100, 100, 30)

// it will fill current path
ctx.setFillStyle(‘red‘)
ctx.fill()
ctx.draw()

2.描边

画出当前路径的边框。默认颜色色为黑色。

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.moveTo(10, 10)
ctx.lineTo(100, 10)
ctx.lineTo(100, 100)
ctx.stroke()
ctx.draw()

Tip: stroke() 描绘的的路径是从 beginPath() 开始计算,但是不会将 strokeRect() 包含进去.

const ctx = wx.createCanvasContext(‘myCanvas‘)
// begin path
ctx.rect(10, 10, 100, 30)
ctx.setStrokeStyle(‘yellow‘)
ctx.stroke()

// begin another path
ctx.beginPath()
ctx.rect(10, 40, 100, 30)

// only stoke this rect, not in current path
ctx.setStrokeStyle(‘blue‘)
ctx.strokeRect(10, 70, 100, 30)

ctx.rect(10, 100, 100, 30)

// it will stroke current path
ctx.setStrokeStyle(‘red‘)
ctx.stroke()
ctx.draw()

注意:

创建路径:ctx.beginPath()和ctx.closePath()

①.开始创建路径:ctx.beginPath()

开始创建一个路径,需要调用fill或者stroke才会使用路径进行填充或描边。

Tip: 在最开始的时候相当于调用了一次 beginPath()。

Tip: 同一个路径内的多次setFillStyle()、setStrokeStyle()、setLineWidth()等设置,以最后一次设置为准。

②.关闭路径:ctx.closePath()

Tip: 关闭路径会连接起点和终点。

Tip: 如果关闭路径后没有调用 fill() 或者 stroke() 并开启了新的路径,那之前的路径将不会被渲染。

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.moveTo(10, 10)
ctx.lineTo(100, 10)
ctx.lineTo(100, 100)
ctx.closePath()
ctx.stroke()
ctx.draw()

3.线段:moveTo(10, 10),lineTo(110, 60)参数都是点的坐标

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.moveTo(10, 10)
ctx.rect(10, 10, 100, 50)
ctx.lineTo(110, 60)
ctx.stroke()
ctx.draw()

ab就是moveTo(10, 10),lineTo(110, 60)绘制出的线段

4.画一条弧线:

ctx.arc(起点x1,起点y1,半径, 起始弧度,终止弧度,可选 弧度方向<false顺时针,true逆时针,默认是顺时针>)

Tip: 创建一个圆可以用 arc() 方法指定其实弧度为0,终止弧度为 2 * Math.PI。

Tip: 用 stroke() 或者 fill() 方法来在 canvas 中画弧线。

var app = getApp()
Page({
	onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘)
		// 绘制一个灰色园
		ctx.arc(100, 75, 50, 0, 2 * Math.PI)
		ctx.setFillStyle(‘#EEEEEE‘)
		ctx.fill()

		//绘制一个坐标系
		ctx.beginPath()
		ctx.moveTo(40, 75)
		ctx.lineTo(160, 75)
		ctx.moveTo(100, 15)
		ctx.lineTo(100, 135)
		ctx.setStrokeStyle(‘#AAAAAA‘)
		ctx.stroke()

		//坐标系4个点的数字
		ctx.setFontSize(12)
		ctx.setFillStyle(‘black‘)
		ctx.fillText(‘0‘, 165, 78)
		ctx.fillText(‘0.5*PI‘, 83, 145)
		ctx.fillText(‘1*PI‘, 15, 78)
		ctx.fillText(‘1.5*PI‘, 83, 10)

		// 绘制圆心那个点
		ctx.beginPath()
		ctx.arc(100, 75, 2, 0, 2 * Math.PI)
		ctx.setFillStyle(‘lightgreen‘)
		ctx.fill()

		//绘制1.5*PI的那个点
		ctx.beginPath()
		ctx.arc(100, 25, 2, 0, 2 * Math.PI)
		ctx.setFillStyle(‘blue‘)
		ctx.fill()

		//绘制0的那个点
		ctx.beginPath()
		ctx.arc(150, 75, 2, 0, 2 * Math.PI)
		ctx.setFillStyle(‘red‘)
		ctx.fill()

		// 绘制黑线的弧度
		ctx.beginPath()
		ctx.arc(100, 75, 50, 0, 1.5 * Math.PI)
		ctx.setStrokeStyle(‘#333333‘)
		ctx.stroke()

		ctx.draw()
	}
})

5.文字

ctx.setFontSize(20):字体的大小

ctx.setTextAlign(‘left‘);设置文字的对齐left,right,center

ctx.fillText(‘文字‘, 文字在画布中起点x1,起点y1):在画布上绘制被填充的文本。

const ctx = wx.createCanvasContext(‘myCanvas‘)

ctx.setFontSize(20)
ctx.fillText(‘Hello‘, 20, 20)
ctx.fillText(‘MINA‘, 100, 100)

ctx.draw()

6.渐变

grd.addColorStop(渐变点在起点和终点中的位置<0-1>, ‘颜色‘):颜色渐变

Tip: 小于最小 stop 的部分会按最小 stop 的 color 来渲染,大于最大 stop 的部分会按最大 stop 的 color 来渲染。

Tip: 需要使用 addColorStop() 来指定渐变点,至少要两个。

①线性渐变:ctx.createLinearGradient(起点x1, 起点y1, 终点x2,终点y2)

Tip: 需要使用 addColorStop() 来指定渐变点,至少要两个

	onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘)

		// 创建线性渐变
		const grd = ctx.createLinearGradient(0, 0, 200, 0)
		grd.addColorStop(0, ‘red‘)
		grd.addColorStop(1, ‘white‘)

		// 绘制图形
		ctx.setFillStyle(grd)
		ctx.fillRect(10, 10, 150, 80)
		ctx.draw()
	}

②圆形渐变:ctx.createCircularGradient(圆点x,圆点y,半径)

Tip: 起点在圆心,终点在圆环。

Tip: 需要使用 addColorStop() 来指定渐变点,至少要两个。

	onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘)
		// 创建圆形渐变
		const grd = ctx.createCircularGradient(75, 50, 40)
		grd.addColorStop(0, ‘red‘)
		grd.addColorStop(1, ‘white‘)

		// 绘制图形
		ctx.setFillStyle(grd)
		ctx.fillRect(10, 10, 150, 100)
		ctx.draw()
	}

7.阴影:ctx.setShadow(阴影x偏移, 阴影y偏移,模糊级别,数值越大越模糊, ‘颜色‘)

Tip: 如果没有设置,offsetX 默认值为0, offsetY 默认值为0, blur 默认值为0,color 默认值为 black。

const ctx = wx.createCanvasContext(‘myCanvas‘)
ctx.setFillStyle(‘red‘)
ctx.setShadow(10, 50, 50, ‘blue‘)
ctx.fillRect(10, 10, 150, 75)
ctx.draw()

8.旋转

①scale(x,y)方法对横纵坐标进行缩放:多次调用scale,倍数会相乘。

const ctx = wx.createCanvasContext(‘myCanvas‘)

ctx.strokeRect(10, 10, 25, 15)
ctx.scale(2, 2)
ctx.strokeRect(10, 10, 25, 15)
ctx.scale(2, 2)
ctx.strokeRect(10, 10, 25, 15)

ctx.draw()

②ctx.rotate(旋转的角度):对坐标轴进行顺时针旋转.

以弧度计(degrees * Math.PI/180;degrees范围为0~360)

以原点为中心,原点可以用 translate方法修改。顺时针旋转当前坐标轴。多次调用rotate,旋转的角度会叠加。

const ctx = wx.createCanvasContext(‘myCanvas‘)

ctx.strokeRect(100, 10, 150, 100)
ctx.rotate(20 * Math.PI / 180)
ctx.strokeRect(100, 10, 150, 100)
ctx.rotate(20 * Math.PI / 180)
ctx.strokeRect(100, 10, 150, 100)

ctx.draw()

③translate(x坐标平移量,y坐标平移量)对坐标原点进行缩放

const ctx = wx.createCanvasContext(‘myCanvas‘)

ctx.strokeRect(10, 10, 150, 100)
ctx.translate(20, 20)
ctx.strokeRect(10, 10, 150, 100)
ctx.translate(20, 20)
ctx.strokeRect(10, 10, 150, 100)

ctx.draw()

9.线条样式

①线条的宽度:ctx.setLineWidth(宽度px)

线条的端点样式:ctx.setLineCap(‘round‘);   值:‘butt‘、‘round‘、‘square‘

onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘);
		//绘制线段
		ctx.moveTo(10, 10);
		ctx.lineTo(150, 10);
		ctx.stroke();

		//线条的端点样式:butt
		ctx.beginPath();
		ctx.setLineCap(‘butt‘);
		ctx.setLineWidth(10);
		ctx.moveTo(10, 30);
		ctx.lineTo(150, 30);
		ctx.stroke();

		//线条的端点样式:round
		ctx.beginPath();
		ctx.setLineCap(‘round‘);
		ctx.setLineWidth(10);
		ctx.moveTo(10, 50);
		ctx.lineTo(150, 50);
		ctx.stroke();

		//线条的端点样式:square
		ctx.beginPath();
		ctx.setLineCap(‘square‘);
		ctx.setLineWidth(10);
		ctx.moveTo(10, 70);
		ctx.lineTo(150, 70);
		ctx.stroke();

		ctx.draw();
	}

②线条的交点样式:ctx.setLineJoin(‘bevel‘)   值:‘bevel‘、‘round‘、‘miter‘

最大斜接长度:ctx.setMiterLimit(2)

斜接长度指的是在两条线交汇处内角和外角之间的距离。

当 setLineJoin() 为 miter 时才有效。超过最大倾斜长度的,连接处将以 lineJoin 为 bevel 来显示

		const ctx = wx.createCanvasContext(‘myCanvas‘);
		//绘制线段
		ctx.beginPath();
		ctx.moveTo(10, 10);
		ctx.lineTo(100, 50);
		ctx.lineTo(10, 90);
		ctx.stroke();

		ctx.beginPath();
		ctx.setLineJoin(‘bevel‘);
		ctx.setLineWidth(10);
		ctx.moveTo(50, 10);
		ctx.lineTo(140, 50);
		ctx.lineTo(50, 90);
		ctx.stroke();

		ctx.beginPath();
		ctx.setLineJoin(‘round‘);
		ctx.setLineWidth(10);
		ctx.moveTo(90, 10);
		ctx.lineTo(180, 50);
		ctx.lineTo(90, 90);
		ctx.stroke();

		ctx.beginPath();
		ctx.setLineJoin(‘miter‘);
		ctx.setLineWidth(10);
		ctx.moveTo(130, 10);
		ctx.lineTo(220, 50);
		ctx.lineTo(130, 90);
		ctx.stroke();

		ctx.draw();
	}

10.全局画笔透明度:ctx.setGlobalAlpha(0.2)

Tip:这个只针对在ctx.setGlobalAlpha(0.2);背后的图形有影响,在它之前的,则没有影响

	onLoad: function() {
		const ctx = wx.createCanvasContext(‘myCanvas‘);
		ctx.setFillStyle(‘red‘);
		ctx.fillRect(10, 10, 150, 100);
		ctx.setGlobalAlpha(0.2);
		ctx.setFillStyle(‘blue‘);
		ctx.fillRect(50, 50, 150, 100);
		ctx.setFillStyle(‘yellow‘);
		ctx.fillRect(100, 100, 150, 100);
		ctx.draw();
	}

11.保存/恢复

在绘制一个整体的元素,特别是使用了图像变换时头尾必须采用save(),restore()

context.save();//保存

图像变换

设置状态

绘制(填充或是描边)

context.restore();//恢复

const ctx = wx.createCanvasContext(‘myCanvas‘)

// save the default fill style
ctx.save()
ctx.setFillStyle(‘red‘)
ctx.fillRect(10, 10, 150, 100)

// restore to the previous saved state
ctx.restore()
ctx.fillRect(50, 50, 150, 100)

ctx.draw()

时间: 2024-10-10 05:08:52

微信小程序开发—(八)canvas绘制图形的相关文章

用微信小程序开发的Canvas绘制可配置的转盘抽奖

使用https://github.com/givebest/GB-canvas-turntable代码移植过而来. 其它 微信小程序感觉是个半成品,代码移植过程比较繁琐麻烦.canvas API 部分都被重写了...canvas z-index不生效,永远在最上层,不支持rotate动画. 更多:点击打开链接

微信小程序开发教程,大多数人都搞错的八个问题

小程序目前被炒得沸沸扬扬,无数媒体和企业借机获取阅读流量. 这再次证明一点,微信想让什么火,真的就能让什么火.这种能力真是全中国再也没有人有了,政府也没有. 但四处传的消息很多是失真的,废话不说,先列出8个多数人都搞错的问题: 小程序是HTML5: 小程序是B/S的: 把M站改改就可以接入到小程序里: 小程序体验不佳: 小程序适合低频长尾应用: 小程序是新的Appstore: 小程序做不起来,需求不高: 小程序会做起来,但会和原生应用长期并存. 以上8个是很多人凭直觉得出的结论,但真正深度调研和

微信小程序开发心得

微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司认证信息如,营业执照等 再次就是用一个未曾开通过公众号的QQ号或微信号来注册一个微信小程序号. 最后,下载微信小程序开发工具. 由于这里,我们更多的关注如何去开发一些app,而不是科谱微信小程序,故在此不在过多的解释,详细的说明,可以去官网帮助文档. 首先,我们拿自己的项目在一步一步的说明并开发吧,

我们的微信小程序开发

基于微信小程序的系统开发准备工作 腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传统的APP来说,微信小程序确实能够大大降低开发成本和难度,但也意味着需要掌握整个微信小程序的各种接口功能.应用场景等相关技术点,本篇随笔先从大的方面来介绍微信小程序开发的一些知识,如架构设计.技术路线 .工具准备等方面做一些浅薄的介绍,希望大家也有所收益,有所借鉴,则善莫大焉. 1.小程序的统一架构

资讯 | 2018年1月15日微信公开课解读!微信小程序开发资源

引言:2018年1月15日 微信公开课PRO开课了,本次课时内容将涉及:小程序.智慧零售.企业微信.小游戏  (附学习参考资料) 为了快速理解「2018 微信公开课 PRO 版」上张小龙的一小时演讲内容,结合下午微信公开课课室A_B_C的课时安排,这里为大家提前整理了相应的小程序学习参考资料: 微信公开课pro_A课室(14:00-17:50) 主题:小程序产品能力.开发.应用及规则 一.如何开发一个优秀的微信小程序/小游戏 微信小程序官方工具  https://mp.weixin.qq.com

9小时搞定微信小程序开发

第01讲-小程序的背景 第02.第2讲-什么是小程序 第03讲-小程序生态及应用前景 第04讲-小程序开发前的准备 第05讲-安装微信开发者工具 第06讲-小程序代码结构简介 第07讲-小程序配置文件介绍 第08讲-开发者工具详解(一) 第09讲-开发者工具详解(二) 第10讲-创建第一个小程序 第11讲-开发框架组成介绍 第12讲-WXML之语法 第13讲-WXML特性之数据绑定 第14讲-WXML特性之列表渲染 第15讲-WXML特性之条件渲染 第16讲-WXML特性之模板及引用 第17讲-

腾讯工程师教你9小时搞定微信小程序开发

下载地址:百度网盘下载 课程介绍本课程从最基础的微信小程序开发工具使用开始讲起,带你走完从写出第一个 HelloWorld 到构建出第一款属于自己的微信小程序的完整学习路线.课程共有八大模块:模块一:微信小程序介绍与开发准备模块二:上手第一个微信小程序模块三:微信小程序开发框架模块四:微信小程序开发之原生组件模块五:微信小程序开发之原生 API模块六:微信小程序开发进阶之核心技能模块七:微信小程序开发项目实战案例模块八:微信小程序开发实战注意事项与进阶指导 课程详细大纲 原文地址:https:/

微信小程序开发工具下载以及安装教程

当我们已经申请微信小程序账号,接下来我们就需要安装一个微信小程序开发工具,下面微信小程序观察网请添加链接描述就和大家介绍一下微信小程序开发工具下载以及安装教程,希望对大家的工作与学习有所帮助! 第一步:微信公众平台上登录你的微信小程序账号 第二步:登录进入小程序开发-工具-下载,再根据你的系统选择相对应的版本地址进行下载. 第三步:以管理员身份运行下载,点击下一步,如图所示: 第四步:下一步,就会出现许可证协议,选择我接受.如图所示: 第五步:选定安装位置,浏览,选择桌面,点击安装,如图所示:

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic