html5Canvas的知识点,是程序员开发者必备技能,在实际工作中也常常会涉及到。
最近熬夜总结html5Canvas相关的知识点,大家一起看一下吧:
Canvas使用的场景有:1,动画;2,H5游戏;3,图表。
效果动画,加载Loading:
H5游戏效果:
对于Canvas需要掌握:
使用Canvas画直线,矩形,圆形以及设置它们的样式。
Canvas中的图形变换,渐变,文字和图片。
使用Canvas画基本图形
Canvas坐标体系
画直线,矩形和原型
ctx.moveTo(x1,y1),ctx.lineTo(x2,y2)
ctx.arc(x,y,radius,0,Math.PI*2,true)
ctx.strokeRect(x1,y1,x2,y2
)beginPath和closePath
描边和填充样式
Canvas中的图形变换,渐变,文字和图片
Canvas中的图形变换
图形变换都是针对坐标系来说的:
ctx.translate(x,y)
ctx.rotate(rad)
ctx.scale(x,y)
save和restore
用来保存和恢复上下文的环境ctx,一般成对出现
ctx.save()
,保存当前上下文环境。ctx.restore()
,恢复到上一次的上下文环境Canvas中的渐变
ctx.createLinearGradient(xStart,yStart,xEnd,yEnd)
(xStart,yStart)
是线段的起点,(xEnd,yEnd)
是线段终点。起点到终点之间的颜色呈渐变。gradient.addColorStop
可以来控制渐变的颜色
ctx.createRadialGradient(xStart,yStart, radiusStart,xEnd,yEnd,radiusEnd);
(xStart,yStart)
是第一个圆的原心,radiusStart
是第一个圆的半径,(xEnd,yEnd)
是第二个圆的原心,radiusEnd
是第二个圆的半径
第一圆到第二个圆之间的颜色呈现渐变。
Canvas中的文字
描边文字:ctx.strokeText(text,x,y)
填充文字:ctx.fillText(text,x,y);
设置字体样式:ctx.font
ctx.font="bold 100px sans-serif"
ctx.textAlign
设置垂直对齐方式:ctx.textBaseline
ctx.measuerText(text).width
须在设置字体样式之后计算Canvas图片
绘制图片3种方法
ctx.drawImage(image,x,y)
,该方法把图片绘制在(x,y)
处ctx.drawImage(image,x,y,w,h)
,该方法把图片绘制在(x,y)
处,并缩放为宽w,高hctx.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
,该方法把图片中(sx,sy)
处的宽sw,高sh的区域,绘制到(dx,dy)
处,并缩放为宽dw
,高dh
在image加载完成之后绘制:
示例:
Canvas绘制
Canvas图形画刷
ctx.createPattern
可以创建一个画刷模式,进而可以设置到fillStyle里,进行画刷的填充。
ctx.createPattern(image,type)
type取值:
no-repeat
不平铺repeat-x
橫方向平repeat-y
纵方向平铺repeat
全方向平铺Canvas像素操作
获取像素
设置像素
设置像素
Canvas阴影绘制
ctx.shadowOffsetX:
阴影x方向的偏移距离ctx.shadowOffsetY:
阴影y方向的偏移距离ctx.shadowColor:
阴影的颜色ctx.shadowBlur:
阴影的模糊半径效果图:
Canvas剪辑区域
Canvas绘制曲线
狐线:
生成工具
Canvas Quadratic Curve Example
http://blogs.sitepointstatic.com/examples/tech/canvas-curves/quadratic-curve.html
http://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html
二次样条曲线:
贝塞尔曲线:
ctx.clearRect(x,y, width,height)
清除(x,y)
点起, 宽width,高height的区域,用于重新绘制
离屏技术是什么:通过在离屏Canvas中绘制元素,再复制到显示Canvas中,从而大幅提高性能的一种技术。
使用离屏技术:
离屏技术:
一个Canvas中的图形绘制到另一个Canvas方法:
对canvas插件的相关了解
什么是Canvas插件,掌握Chart.js插件,了解Chartist.js和HighCharts.js插件
(图表)Chart.js插件:https://www.chartjs.org/
Chartist.js插件是一个简单的响应式图表插件:支持SVG格式(http://gionkunz.github.io/chartist-js/)
HighCharts.js插件:方便快捷的HTML5交互性图标库:https://www.highcharts.com/
Chartist.js插件与HighCharts.js插件
响应式布局,它的用户体验友好,响应式网站可以根据不同终端,不同尺寸和不同应用环境,自动调整界面布局,展示内容,提供非常好的视觉效果。响应式布局就是一个网站能够兼容多个终端
示例:
使用JavaScript实现绘图的流程
在开始绘图时,先要获取Canvas元素的对象,在获取一个绘图的上下文。
获取Canvas对象 ,使用document对象的getElementById()方法获取。
创建二维的绘图上下文对象
使用getContext()方法来获取
在Canvas上绘制文字
绘制图像:
使用drawImage()方法可以将图像添加到Canvas画布中,绘制一幅图像,需要有三个重载的方法:
使用:
参数:
参数 | 描述 |
---|---|
image | 规定要使用的图像,画布或视频 |
sourceX | 开始剪切的x坐标位置 |
sourceY | 开始剪切的y坐标位置 |
sourceWidth | 被剪切图像的宽度 |
sourceHeight | 被剪切图像的高度 |
destX | 在画布上放置图像的 x 坐标位置 |
destY | 在画布上放置图像的 y 坐标位置 |
destWidth | 要使用的图像的宽度 |
destHeight | 要使用的图像的高度 |
插入图像:
在Canvas中绘制文字“达达前端”:
两个方法:
绘制矩形边框,使用strokeStyle方法:
填充矩形区域,使用fillRect()方法:
绘制矩形
使用clearRect方法,可以擦除指定的矩形区域:
在实际开发中,画布是默认300*150的大小。
示例:
向 HTML5 页面添加 canvas 元素
需要理解些概念:
stroke()
fill()
closePath()
beginPath()
1px
(butt默认)、round、square
miter(默认)、round、bevel
setLineDash()
设置虚线getLineDash()
获取虚线宽度集合lineDashOffset
设置虚线偏移量(负值向右偏移)rect(x,y,w,h)
没有独立路径strokeRect(x,y,w,h)
有独立路径,不影响别的绘制fillRect(x,y,w,h)
有独立路径,不影响别的绘制clearRect(x,y,w,h)
擦除矩形区域startAngle
开始角度endAngle
结束角度anticlockwise
是否逆时针方向绘制(默认false表示顺时针;true表示逆时针)ctx.font
= ‘微软雅黑’ 设置字体strokeText()
fillText(text,x,y,maxWidth)
ctx.textAlign
文本水平对齐方式,相对绘制坐标来说的 ctx.direction
属性css(rtl ltr) start和end
于此相关 ltr,start和left
表现一致rtl,start和right
表现一致ctx.textBaseline
设置基线(垂直对齐方式 ) measureText()
获取文本宽度obj.widthdrawImage()
drawImage(img,x,y)
drawImage(img,x,y,w,h)
drawImage(img,x,y,w,h,x1,y1,w1,h1)
translate(x,y)
参数表示移动目标点的坐标scale(x,y)
参数表示宽高的缩放比例rotate(angle)
参数表示旋转角度创建绘图路径
使用方法:beginPath()和closePath()
,分别表示开始一个新的路径和关闭当前的路径
rect(x,y, width, height)
:xy,起点坐标,矩形的宽高,绘制矩形路径closePath方法关闭当前路径
stokeStyle
属性设置矩形边框的颜色lineWidth
属性设置边框的宽度fillStyle
属性设置填充的颜色绘制网格,网格大小
绘制坐标系,确定圆点,确定离画布旁边的距离,确定坐标轴的长度,确定箭头的大小,绘制箭头填充。
arc创建一个圆形,rect创建一个矩形,最后调用stroke()方法和fill()方法
使用beginPath()方法可以新创建一个子路径,closePath()方法用来闭合路径的。
绘制两条直线
如果不用beginPath()
方法,绘制图形时不再创建子路径,第一次的图形在执行过程中会被绘制填充两次。
图形组合
属性 globalCompositeOperation
设置如何在画布上组合颜色
12中组合类型:
值 | 说明 |
---|---|
copy | 只绘制新图形,删除其他所有内容 |
darker | 在图形重叠的地方,颜色由两个颜色值相减后决定 |
destination-atop | 已有的内容只在它和新的图形重叠的地方保留,新图形绘制在内容后 |
destination-in | 在新图形和已有画布重叠的地方,已有内容都保留,所有其他内容成为透明 |
destination-out | 在新图形和已有内容不重叠的地方,已有内容保留所有其他内容成为透明 |
destination-over | 新图形绘制于已有内容的后面 |
lighter | 在图形重叠的地方,颜色由两种颜色值的叠加值来决定 |
source-atop | 只在新图形和已有内容重叠的地方才绘制新图形 |
source-in | 在新图形和已有内容重叠的地方,新图形才会被绘制,所有其他内容成为透明 |
source-out | 只在和已有图形不重叠的地方绘制新图形 |
source-over | 新图形绘制于已有图形的顶部 |
xor | 在重置和正常绘制的其他地方,图形都成为透明 |
绘制曲线
x,y
表示弧的圆形的圆心坐标radius
表示弧的圆形的半径startAngle
表示圆弧的开始点的角度endAngle
表示圆弧的结束点的角度counterclockwise
若true表示逆时针,false反之顺时针如果使用css
设置宽高,画布会按照300*150
的比例进行缩放,将300*150
的页面显示在400*400
的容器中。
使用js动态设置宽高。
建议使用HTML中的width和height,或者js动态设置宽高
创建一个canvas标签,第一步:
方法:
fill()
填充路径stroke()
描边arc()
创建圆弧rect()
创建矩形fillRect()
绘制矩形路径区域strokeRect()
绘制矩形路径描边clearRect()
在给定的矩形内清除指定的像素beginPath()
起始一条路径,或重置当前路径moveTo()
把路径移动到画布中的指定点,不创建线条lineTo()
添加一个新点,在画布中创建从该点到最后指定点的线条clip()
从原始画布剪切任意形状和尺寸的区域arcTo()
创建两切线之间的弧/曲线quadraticCurveTo()
创建二次方贝塞尔曲线bezierCurveTo()
创建三次方贝塞尔曲线isPointInPath()
如果指定的点位于当前路径中,则返回 true,否则返回 false辅助线绘制弧线:arcTo()
方法
语法:
arcTo()方法绘制一条弧线
代码:
quadraticCurveTo()
方法:
bezierCurveTo()
方法:它是应用于二维图形应用程序的数学曲线。
绘制曲线:
lineCap
设置或返回线条的结束断点样式lineJoin
设置或返回两条线相交时,产生拐角类型lineWidth
设置或返回当前的线条宽度miterLimit
设置或返回最大斜接长度fillRect()
绘制一个实心矩形strokeRect()
绘制一个空心矩形设置阴影,shadowBlur
-context.shadowBlur
= 20
createLinearGradient()
创建线性渐变createPattern()
在指定的方向上重复指定的元素createRadialGradient()
创建放射状/环形的渐变addColorStop()
规定渐变对象中的颜色和停止位置scale()
缩放当前绘图变大或变小rotate()
旋转当前绘图translate()
重新映射画布的(0,0)位置使用三种方法插入图像
在插入图像之前,需要考虑图像加载的时间,如果图像没加载完成就已经执行drawImage()方法,就不会显示任何图片。
提供了两种渐变的创建的方法:
设置渐变颜色和过渡方式
语法如下:
线帽属性:lineCap
,表示指定线条的末端如何绘制
值:lineCap: butt, round, square
,当线条具有一定的宽度才能表现出来。
线条的连接属性lineJoin
,用于两条线条到的连接方式:
miter
两条线段的外边缘一直延伸到它们相交,属性miterLimit是用来描述如何绘制两条线段的交点,是表示延伸长度和线条长度的比值。
默认为10,只有miter
使用时有效
语法如下:
repeat
表示图像在各个方向上循环平铺repeat-x
表示图像在横向上循环平铺repeat-y
表示图像在纵向上循环平铺no-repeat
表示图像只使用一次移动变化:
缩放变换,语法如下:
旋转变换:
矩形变形,语法如下:
绘制文本的方法:
fillText(text, x, y, maxwidth)
strokeText(texxt, x, y, maxwidth)
text
表示要绘制的文本maxwidth
表示显示文本的最大宽度文本属性表:
属性 | 说明 |
---|---|
font | 数组字体样式 |
textAlign | start,end,left,right,center |
textBaseline | top,hanging,middle,alphabetic,ideographic,bottom |
绘制文本
绘制获取文本宽度的measureText()
方法:
测量文本的宽度:
阴影效果
阴影属性表:
属性 | 说明 |
---|---|
shadowColor | 使用半透明颜色 |
shadowOffsetX | 阴影的横向位移量 |
shadowOffsetY | 阴影的纵向位移量 |
shadowBlur | 高斯模糊 |
状态保存和恢复
save()
restore()
,恢复最后一次保存的状态状态的保存和恢复是通过数据栈进行的
ImageData
getImageData()
,用于从Canvas
上下文中获取图像数据。getImageData(sx, sy, sw, sh);
putImageData()
getImageData(imagedata,dx,dy[,..])
createImageData()
曲线
quadraticCurveTo( cp1x, cp1y , x ,y )
(cp1x,cp1y) 控制点 (x,y)结束点
bezierCurveTo( cp1x, cp1y ,cp2x , cp2y ,x , y )
(cp1x,cp1y)控制点1 (cp2x,cp2y) 控制点2 (x,y)结束点
crossOrigin
属性设置成Anonymous
就可以跨域? - 并不可以的哦!
base64
格式(后端,前端,建议前端)大致效果:
CanvasContext``canvas
组件的绘图上下文
CanvasContext
是旧版的接口, 新版 Canvas 2D
接口与 Web
一致。
string|CanvasGradient fillStyle
- 填充颜色string|CanvasGradient strokeStyle
- 边框颜色number shadowOffsetX
- 阴影相对于形状在水平方向的偏移number shadowOffsetY
- 阴影相对于形状在竖直方向的偏移number shadowColor
- 阴影的颜色number shadowBlur
- 阴影的模糊级别number lineWidth
- 线条的宽度string lineCap
- 线条的端点样式string lineJoin
- 线条的交点样式lineJoin
值 | 说明 |
---|---|
bevel | 斜角 |
round | 圆角 |
miter | 尖角 |
number miterLimit
- 最大斜接长度number lineDashOffset
- 虚线偏移量,初始值为0几个相关的画图api 点这里