细说 Canvas API(一)

Canvas API:可以动态生成和展示图形、图表、图像以及动画。不需要将所绘制图像中的每个图元当作对象存储,因此执行性能非常好。在页面中加入了 canvas 元素后,我们便可以通过 JavaScript 来自由地控制它。
Canvas 本质上是一个位图画布,其上绘制的图形都是不可缩放的,不能像 SVG 图像那样可以被放大缩小;此外,用 Canvas 绘制出来的对象不属于页面 DOM 结构或任何命名空间;SVG 图像却可以在不同的分辨率下流畅的播放,并且支持单击检测。
如果你的图像需要显著的交互行为,那么可以考虑使用 SVG 代替 Canvas API。SVG 也能用于绘制,而且它整合了浏览器的 DOM。
介绍完了,下面开始我们的愉(黑)快(暗)的学习之路吧==
一、路径
HTML5 Canvas API 中的路径代表你希望呈现的任何形状。
按照惯例,不论开始绘制何种图形,第一个需要调用的就是 beginPath,这个简单的函数不带任何参数,它用来通知 Canvas 将要开始绘制一个新的图形了。对于 Canvas 来说,beginPath 函数最大的用处就是 Canvas 需要据此来计算图形的内部和外部范围,以便完成后续的描边和填充。
context 路径函数:

moveTo(x,y) 不绘制,只是将当前位置移动到新的目标坐标(x,y)
lineTo(x,y) 不仅将当前位置移到新的目标坐标(x,y),而且在两个坐标之间画一条直线。
closePath() 会将路径的起始坐标自动作为目标坐标。

context 属性:

linejoin 修改当前形状中线段的连接方式,值可以为 round,bevel 或 miter.
lineWidth 线宽
StrokeStyle 改变线条颜色
lineCap 指定线条末端的样式,值可以为 butt,square 或者 round
fillStyle 填充颜色

绘制矩形区域的函数:

rect(x,y w,h) 创建矩形
fillRect(x,y,w,h) x,y 是矩形左上角的坐标,w,h 为宽度和高度。(填色,默认为黑色)
strokeRect(x,y w,h) x,y 是矩形左上角的坐标,w,h 为宽度和高度。(无填色)
clearRect(x,y w,h) 清除矩形区域内的所有内容并将它恢复到初始状态,即透明色

二、绘制曲线

Canvas 提供了一系列绘制曲线的函数。

quadraticCurveTo() 创建二次贝塞尔曲线
bezierCurveTo() 创建三次方贝塞尔曲线
arc() 创建弧/曲线(用于创建圆形或部分圆)
arcTo() 创建两切线之间的弧/曲线

三、在 Canvas 中插入图片
图片增加了 canvas 操作的复杂度,必须等到图片完全加载后才能对其进行操作。即开发时,要注意,在呈现之前,应确保图片已经加载完毕。
相关函数:drawImage(img,x,y,width,height);

四、渐变
渐变是指在颜色集上使用逐步抽样算法,并将结果应用于描边样式和填充样式中。
使用渐变有 3 个步骤:
(1)创建渐变对象;
(2)为渐变对象设置颜色,指明过渡方式;
(3)在 context 上为填充样式或者描边样式设置渐变。
可以将渐变看作是颜色沿着一条线进行缓慢的变化。
要设置显示哪种颜色,在渐变对象上使用 addColorStop 函数即可。这个函数允许指定两个参数:颜色和偏移量。颜色即渐变的颜色,偏移量是一个 0.0 到 1.0 之间的数值,代表沿着渐变线渐变的距离有多远。
HTML5 Canvas API 还支持 放射性渐变,所谓放射性渐变是指颜色会介于两个指定圆间的锥形区域平滑变化。
相关函数:createRadialGradient(x0,y0,r0,x,y,r)

五、背景图
相关函数:createPattern(image,x)
第二个参数为重复性参数:

平铺方式 意义
repeat (默认值)图片会在两个方向平铺
repeat-x 横向平铺
repeat-y 纵向平铺
no-repeat 图片只显示一次,不平铺

六、缩放 Canvas 对象
scale() 函数带有两个参数来分别代表在 x,y 两个维度的值。每个参数在 canvas 显示图像的时候,向其传递在本方向轴上图像要 放大(或者缩小)的量。
注意:缩放 (scale) 和旋转(rotate)等变换操作都是针对原点进行的。如果对一个不在原点的图形进行旋转变换,那么 rotate 变换函数将图形绕着原点旋转而不是在原地旋转。

七、Canvas 变换
(1)context.rotate(angle) 来旋转图像,甚至可以直接修改底层变换矩阵以完成一些高级操作,如剪裁图像的绘制路径。
(2)canvas.transform()
画布上的每个对象都拥有一个当前的变换矩阵(具体如何获取??有待探索)。transform() 方法替换当前的矩阵来操作当前的变换矩阵:
context.transform(a,b,c,d,e,f);
a c e
b d f
0 0 1
即 transform() 允许您缩放、旋转、移动并倾斜当前的环境。
注意: 该变换只会影响 transform() 方法调用之后的绘图。

a 水平缩放绘图
b 水平倾斜绘图
c 垂直倾斜绘图
d 垂直缩放绘图
e 水平移动绘图
f 垂直移动绘图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容