Canvas概述
1. 与Flas的区别
Canvas 和Flash的思路完全不一样,Flash是上屏幕之后还是对象,编程语言叫做 Action Script 也是ECMAScript范畴。Canvas上屏幕之后像素化了,再也不能得到这个对象了,所以要想让这个元素运动,必须擦除整个屏幕、重绘这个元素。Canvas更流畅,手机端也嗷嗷流畅。
2. 创建Canvas画布标签
显示默认提醒消息:如果浏览器不支持Canvas,Canvas会被默认渲染为普通标签显示文字
1 | <canvas width="200px" height="200px">对不起您的浏览器不支持画布!</canvas> |
注意:Canvas有一个默认宽高,大概为300 x 150
,如果我们用CSS样式去设置Canvas的宽高,会导致画布扭曲,必须在Canvas标签内部,以属性的方式去添加宽高值。
3. 用Javascript操作2D画布
首先要获取到画布对象:
1 | <canvas id="myCanvas" width="800px" height="500px">对不起您的浏览器不支持画布!</canvas> |
获取到画布后,使用画布对象上的 .getContext()
方法新建一个画布
1 | // 设置上下文,就相当于打开ps之后让你新建画布 |
之后就可以对画布进行详细的样式操作(要在绘制动作前设置样式),如设置背景颜色:
1 | ctx.fillStyle = "pink" |
设置完样式之后就可以进行绘制操作,如绘制成一个矩形(Rect)
1 | ctx.fillRect(100, 100, 300, 200) |
4. API
方法:
1 | fillRect(a, b, c, d) 绘制一个填充矩形,abcd分别为四个坐标 |
属性:
1 | fillStyle 设置填充颜色; |
笔触、填充
1. 简述
笔触也叫作“描边”,Canvas中的任何形状都是由这两个部分组成的。
笔触在canvas中视为一个“Path”的实例,必须stroke之后才能上屏幕;填充用fill才能上屏幕。
3. 绘制路径
使用 beginPath()
代表开始绘制;moveTo(x, y)
代表将笔触移动到某一坐标;lineTo(x, y)
代表直线绘制到某一点;使用 stroke()
能将绘制的图像显示出来。
如下可以绘制出一条折线:
1 | ctx.beginPath(); |
使用 closePath()
可以将最后一个绘制点【该绘制点是被用moveTo(x, y)
打断绘制前的那个点】与第一个绘制点连接:
1 | ctx.beginPath(); |
连续使用 moveTo()
可以让开始新的绘制点:
1 | ctx.beginPath(); |
4. 绘制样式
在绘制前可以对绘制的线段进行样式设置:
1 | ctx.lineWidth = "10"; |
在绘制之后,使用 fill()
可以填充封闭图像(如果没有封闭也会自动封闭)的颜色,设置 fillStyle
属性可以来设置填充颜色:
1 | ... ... |
使用了 fill()
之后,Canvas会自动认为之前的绘制操已经绘制了一个独立的图形。
6. 快速绘制
strokeReact(x, y, w, h)
快速绘制一个矩形
1 | ctx.fillStyle = "lightseagreen" |
filRecto是一个快捷方法,让你省略了beginPath、move To、lineTo。所以fillRect(100,100,300,200)等价于:
1 | ctx.move(100,100); |
6. 绘制复杂图像
1 | for (var i = 0; i <= 500; i += 10) { |
7. API
方法:
1 | beginPath() 代表开始绘制 |
属性:
1 | lineWidth 设置绘制线的宽度 |
弧
1. 绘制弧线
使用 arc(x, y, r, startRad, endRad, bollen)
绘制弧线,arc属于笔触,需要使用beginPath()
和stroke()
来设置开始与绘制动作。
1 | ctx.beginPath(); |
整圆就是 ctx.arc(200, 200, 100, 0, Math.PI*2, true);
绘制笑脸的方法:
1 | <canvas id="myCanvas" width="800px" height="500px">对不起您的浏览器不支持画布!</canvas> |
2. API
方法:
1 | arc(x, y, r, startRad, endRad, bollen) |
绘制渐变
1. 创建渐变色
使用 createLinearrGradient(x1, y1, x2, y2)
创建一个渐变对象,用 addColorStop(rate, color)
添加渐变颜色,将画布的 fillStyle
属性设置为这个渐变对象,即可以填充渐变颜色。
如绘制一个矩形,矩形内的填充色为从blue
渐变到red
1 | var lingrad = ctx.createLinearGradient(100, 100, 400, 400); |
2. API
方法:
1 | createLinearrGradient(x1, y1, x2, y2) |
文字
1. 添加文字
使用 fillText(content, x, y)
来设置文字,注意(x, y)为文字基线的位置
1 | ctx.fillText("你好", 100, 100); |
2. 调整样式
通过 font
属性来设置字体、字号
1 | ctx.font = "宋体" |
font
的级联样式 ctx.font = "font-size font-family"
使用图片
1. 添加图片
添加一个图片首先要创建一个img
的实例,设置实例的src
,监听这个实例的load事件,当图片加载完成后,利用 drawImage(img, x, y)
绘制出图片,如下实例:
1 | var img = new Image(); |
2. API
1 | drawImage(img, x, y, w, h) |
运动
1. 原理
canvas中元素不能运动,因为上屏幕之后就再也得不到它了,没有任何变量可以持有。
所以必须通过重绘一个新的矩形,利用视觉暂留,形成运动。
清屏 → 更新 → 渲染 → 清屏 → 更新 → 渲染 → …
清屏:
1 | ctx.clearRect(0, 0, 800, 600) |
2. 面向对象制变成作运动函数
1 | function Circle(x, y, r, color) { |
3. 使用ES6来详细来面向对象编程编写动画函数
1 | // 接口 |