vlambda博客
学习文章列表

动画与Canvas图形-JavaScript高级编程第4版(21)

早期动画是通过调用setInterval设置每隔多长时间更新一次实现的,因为显示器的刷新率是60HZ,所以最佳重绘时间是1000毫秒/60,约17ms。但是因为setInterval并不能保证时间精度,只是加到任务队列,但是不保证立即执行,所以如果动画频率和屏幕刷新频率不一致,容易引起丢帧,导致动画卡顿。


requestAnimationFrame函数,它会通知浏览器,由浏览器决定什么时候进行绘制,因此解决了动画不平滑的问题。使用时传入动画更新函数作为参数,动画更新函数内部递归以自己为参数调用requestAnimationFrame。取消时使用cancelAnimationFrame。


requestAnimationFrame跟setInterval不一样,在页面不可见时,浏览器会控制暂停动画,因此节省了cpu。另外在高频率事件(resize,scroll等)中,为了防止在一个刷新间隔内发生多次函数执行,使用requestAnimationFrame可保证每个刷新间隔内,函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销。


Canvas画布提供了2d和3d(webgl)上下文,可以在上面实现绘图。通过c.getContext('2d')或c.getContext('webgl2')获取上下文对象。2d上下文对象有以下功能:


填充和描边

fillStyle 上下文中填充样式,可以是css支持的任何格式
stokeStyle 上下文中描边样式,可以是css支持的任何格式


绘制矩形:矩形是2D上下文中唯一一个可以直接绘制的图像

fillRect(x, y, width, height)
填充一个矩形
stokeRect(x, y, width, height)
描边一个矩形
clearRect(x, y, width, height)
画一个空白矩形


绘制路径

beginPath()
开始一个路径
closePath()
结束一个路径
moveTo(x, y)
不绘制,只把光标移动到x,y
LineTo(x, y)
绘制一条上一个点到x,y的直线
rect(x, y, width, height)
绘制矩形路径,而不是图形
arc(x, y, radius, startAngle, endAngle, counteclockwise)
绘制弧形
arcTo(x1, y1, x2, y2, radius)
经由x1, y1绘制一条从上一点到x2,y2的弧形
lineCap
直线端点的样式:butt(平头),round(圆头),square(出方头)
lineJoin
线条交点样式:round(圆转),bevel(取平),miter(出尖)
lineWidth
线宽


绘制文本

stokeText(text, x, y)
描边绘制文本
fillText(text, x, y)
填充绘制文本,一般都用fillText方法
font

字体样式,如"10px Arial"
textAlign

左右对其方式:start, end, left, right, center

textBaseLine
上下对齐方式:top, hanging,middle, alphabetic, ideographic, bottom
metureText(text).width
文本占用宽度,用于调整font的大小


变换

rotate(angle)
围绕原点旋转角度
scale(scaleX, scaleY)
通过在x,y轴乘以scaleX,和scaleY来缩放图像,默认值scaleX和scaleY都是1
translate(x, y)
将原点移动到x, y
transform(m1_1, m1_2, m2_1, m2_2, dx, dy)
通过矩阵乘法修改矩阵
setTransform(m1_1, m1_2, m2_1, m2_2, dx, dy)
把矩阵重置为默认值,再用传入的参数调用transform
save()
将绘制上下文的设置和变换压栈存储
restore()
从栈中取到上次save的绘制上下文和变换,恢复


绘制图像

drawImage(image/video/canvas, x, y)
绘制图像
toDataURL()
获取图像


阴影

shadowBlur
像素,表示阴影模糊量。默认0表示不模糊
shadowColor CSS颜色,默认黑色
shadowOffsetX / shadowOffsetY
相对于形状或路径的偏移量,默认为0


渐变

createLinearGradient(x1, y1, x2, y2)
创建两个点之间的渐变
createRaialGradient(x1, y1, radius1, x2, y2, radius2)
创建径向渐变(放射性渐变)
addColorStop(index, color)
为渐变添加色标


图案

createPattern(image/video/canvas, repeatMode)
创建重复图像模式,返回值赋值给fillStyle。repeatMode可以为repeat, repeat-x, repeat-y, no-repeat


图像数据

getImageData(x, y, width, height) 返回的data属性是一个数组,表示每个像素的rgba信息,可以进行例如设置黑白版等精确的控制
putImageData(imageData, x, y)
将修改后的像素信息,重绘到x,y


合成

golobalAlpha
指定全局透明度,默认0
globalCompositionOperation
指定新绘制的图形与已有图形的位置关系。source-over默认值,新图形在上,soure-in只画与老图形的重叠部分,source-out只画与老图形不重叠的部分,source-atop只画重叠部分,老图形不受影响。另外还有把source变成destination的四个值。还有ligher,copy,xor等值。