返回列表 发新帖

24个canvas基础知识小结

364.0k 9
swmozowtfl 发表于 2015-7-26 20:46:06|湖北 | 查看全部 阅读模式
现把canvas的知识点总结如下,以便随时查阅。8 G5 \" N$ O  D6 K' t! C6 R! v
1、填充矩形 fillrect(x,y,width,height);
- p' j# `+ W. D/ D+ q/ k2、绘制矩形边框 strokerect(x,y,width,height);* Z- s2 ]: G! Z! h
3、擦除矩形 clearrect(x,y,width,height);
/ j/ D7 @* N, Q- \, L* }4、填充样式 fillstyle=red; 样式可以为颜色、渐变和图像。
+ S: s! d+ f* k& s+ \5、描边样式 strokestyle=red;
# i* f/ Z* ^8 P6、描边线条的宽度 linewidth=4;
; Q5 G4 j- W0 J- F7、线条末端形状 linecap=butt; butt(对接)/round(圆)/square(方),默认情况下是butt;
: a1 B! W* o9 e: p  ~+ e8、线条相交样式 linejoin=miter; miter(尖角)/round(圆角)/bevel(斜角),默认尖角;
9 h$ w4 `' u, @* }4 H9、开始绘制路径 beginpath();# Z. E% V4 C0 O2 w9 n
10、结束路径 closepath(); 创建路径后,如果想绘制一条连接到路径起点的线条,可以调用closepath();
6 ~% J2 Z1 V6 s11、绘制圆弧 arc(x,y,radius,startangle,endangle,true/false);
6 S% k- y; H( I$ `( c1 ^3 D12、绘制弧线 arcto(x1,y1,x2,y2,radius) 从上一点开始绘制一天弧线,到x2,y2为止,并且以给定的半径radius穿过x1,y1;
( n) u2 n7 l; k0 C5 m* y  y- k13、moveto(x,y); 将绘图游标移动到(x,y),不画线; ~5 f4 e+ Y; W9 v" E& o9 Z
14、lineto(x,y); 从上一点开始绘制一条直线% l! F% H' _9 B
15、二次贝塞尔曲线: quadraticcurveto(cx,cy,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx,cy作为控制点。
* d8 Y" H5 s6 k$ g16、三次贝塞尔曲线: beziercurveto(cx1,cy1,cx2,cy2,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx1,cy1和cx2,cy2作为控制点。5 x8 I6 h# E# a. A+ B! a3 G8 O
17、rect(x,y,width,height);从点x,y开始绘制矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是独立形状。
' Y# x& b+ Q+ a% `18、绘制文本:
! f, H( S- k- p(1) 填充文本:filltext(hello,x,y,width);width为可选的最大像素宽度,如果文本大于最大宽度,则文本会收缩以适应最大宽度。, V5 l+ v* O: ^0 N% e' t! I
(2) 文本描边:stroketext(hello,x,y,width);width为可选的最大像素宽度。
4 g$ N  ~0 t9 K! Y1 m: |(3) 文本样式:font=bold 14px arial;
( {: w- [/ |) |/ W0 F0 V( W4 o" G' ?(4) 水平文本对齐:textalign='start'; // start, end, left,right, center。默认值:start。以文字的起始点(x,y)为基点的纵轴进行对齐。9 H" m6 ]' G' m, W% M
(5) 垂直文本对齐:textbaseline='alphabetic'; //top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic。以文字的起始点(x,y)为基点的横轴进行对齐。9 ]# O) ~0 t. H- A
(6) 文本的宽度:var text=hello; var length=context.measuretext(text);参数text为所需要绘制的文字# {0 a# t: O( ^( ~% S; f- x7 |
19、变换
' {5 a3 {7 k/ Z, _0 w) ^. }(1) rotate(angle):围绕原点旋转图像angle弧度。+ |6 C2 A" v2 C3 |6 Y" ]! D) S
也可以使用transform(math.cos(angle*math.pi/180),math.sin(angle*math.pi/180),-math.sin(angle*math.pi/180),math.cos(angle*math.pi/180),0,0);
3 l5 h- \3 }8 R1 s  s0 l(2) scale(x,y):缩放图像。也可以使用transform(x,0,0,y,0,0);  e# }: A! }5 V, Q' o' j
(3) translate(x,y):将坐标原点移动到x,y,执行这个变换之后,坐标0,0会变成之前由x,y表示的点。也可以使用transform(1,0,0,1,x,y);1 H+ Y7 ~9 Y: W# f, x  x, ]" p
(4) transform(<number>, <number>, <number>,<number>,x, y);
$ ~& {9 E) n7 ^* H(5) settransform(<number>, <number>, <number>,<number>,x, y);将变换矩阵重置为默认状态,然后再调用transform();  l0 X1 J* H# L/ V; H
20、图形组合
2 c6 D' I& h. F" G+ K代码如下:! F5 j3 t/ C9 H3 E1 ]( T- O* S
context.fillstyle=blue;
9 u4 M- m& L" zcontext.fillrect(10,10,100,100);
' i" |+ \- r3 W3 z( S6 I( Ocontext.globalcompositeoperation='lighter'; 可选值如/* */内。
$ R  {0 Q8 [! I0 D+ {context.fillstyle=red;. w( s" `2 ?/ [& Q! z
context.arc(110,60,50,0,math.pi*2,false);5 J& k7 K: {8 q2 ~; Z1 q4 \4 }, \
context.fill();
  ~* U, ]+ F4 G  g6 [. W/*
6 i3 d7 V5 _4 K& p8 tsource-over(默认值):
9 V' U: l* H; Tdestination-over:在原有图形之下绘制新图形% O  ]5 p( L7 ^& ~9 H
source-in:新图形与原有图形作in运算,只显示新图形中与原有图形相重叠的部分
& z, \' O9 `4 I3 mdestination-in:原有图形与新图形作in运算,只显示新图形中与原有图形相重叠的部分
5 O: N7 Y. g( Z5 H6 T% Y9 Asource-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分: c" _' q* E! b4 n& A
destination-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分1 |% L" ~6 q: i
source-atop:只绘制新图形中与原有图形重叠的部分和未被重叠的原有图形
. L" \  v0 I3 w" d- bdestination-atop:只绘制原有图形中被新图形重叠的部分和新图形的其他部分$ E6 Q* r4 e, a4 k$ E- e
lighter:原有图形与新图形均绘制,重叠部分做加色处理
5 i! q4 {2 j4 \: v9 ~8 Hxor:只绘制新图形与原有图形不重叠的部分,重叠部分变透明
* x" O. Y; N; h0 t2 pcopy:只绘制新图形
8 \4 d" w3 n5 @  t+ r$ l$ g4 F*/: i# o5 y: C  G
21、绘制图形阴影
1 u( J  D# ]3 ]% q8 l( J$ _代码如下:
: |3 q" c$ t. [- ^
context.shadowoffsetx=10; //阴影的横向位移量5 |0 i0 w* g/ P- o& ~2 Y6 Q! [
context.shadowoffsety=10; //阴影的纵向位移量# W( P( X" @: ^6 m
context.shadowcolor='rgba(100,100,100,0.5)'; //阴影的颜色
) Z- R& g" E4 Ncontext.shadowblur=7; //阴影的模糊范围# J5 T- ~$ ^8 Z# X' S+ R
22、绘制、平铺、裁剪图像
; D2 U& P2 z. u$ Y# k6 r代码如下:
7 W/ m6 v8 o1 \/ l6 e  X4 Q
context.drawimage(image,x,y);
& T3 V( }' Q3 f  L$ a  ~5 ^6 \! S; Lcontext.drawimage(image,x,y,w,h);' [' a& w6 V. d3 k
context.drawimage(image,sx,sy,sw,sh,dx,dy,dw,dh);sx,sy和sw,sh为源图像的被复制区域的起始坐标和高度,dx,dy和dw,dh为复制后的区域的目标坐标和高度。+ P& r. e' B7 q! W  R9 \& G
context.createpattern(image,type);图像平铺,参数可以为:no-repeat,repeat-x,repeat-y,repeat;, L9 k+ q6 S, A/ r
context.clip(); //裁剪功能% C9 k7 g( q8 ]; L! L5 w
例子:( |& m1 Q6 Y. m
代码如下:$ C: n/ D' E/ c3 O0 g
image=new image(); //创建image对象( q) G: Q9 v: l- {
image.src=../images/wukong.gif;/ X0 t  v/ z3 b" R1 ^
var test=context.createpattern(image,'repeat-y');//createpattern设置平铺效果,% }7 Z+ e7 c' J" F$ v$ J8 L. I
context.fillstyle=test;) Z6 |& g3 X/ W, v
context.fillrect(0,0,400,400);
* @* |  i/ H) e$ t- B4 _6 v; e- Yimage.onload=function() { //此方法的作用是,如果图片是比较大的网络图像文件,防止图像全部装载完毕才看见该图像,这样就可以一边装载一边绘制了。
, a+ z! E) V& M4 L! ldrawimg(context,image);- A3 O  V1 x' P- T. H% y  Z
}2 L2 A" L' }; ]4 g" F: S$ z; |0 K5 \9 a
function drawimg(context,image){
$ g9 S; [+ m$ S/ Y5 @, _//绘制原始图像, R: f& j$ H3 Y! {7 s: n
context.drawimage(image,10,10,125,125);
' Z% a* y1 y: W/ ~9 p//局部放大
; K) B% U! h* H; Ycontext.drawimage(image,20,0,90,100,150,10,125,125);
3 Y/ g) [9 F  y# B  \5 Fcontext.rect(20,20,80,80);3 N6 D8 T0 T4 D' W4 J1 @6 N% B9 `6 S
context.clip();& ]$ O. r2 Z% _  Z5 R; H
context.drawimage(image,0,0,200,200);- M1 L5 |# X# G4 Z0 c$ \
}
; Z: T. N% c1 v6 n' b3 r' A23、保存、恢复! ]# d. @$ Z0 f& ?* e2 A2 G, t
contex.save();将当前状态保存到栈中。注意:保存的只是对绘制图形的设置和变换,不会保存绘制图形的内容。
/ O$ O4 L& O! X1 Bcontext.restore();从栈中取出之前保存的图形状态) C+ J5 V+ m. W4 Q7 z% L% h! P
可以应用的场合:
6 g* ?5 {) p7 R2 H' X0 Y(1)图像或图形变形7 i) @) p* Y  B- @# h- z+ q( I. K
(2)图像裁剪
' O8 V5 H3 p5 l1 u& s, o(3)改变图形上下文时属性时:fillstyle,font,globalalpha,globalcomposite-operation,linecap,linejoin,linewidth,miterlimit,shadowblur,shadowcolor,9 T0 J/ }& s* k% _
shadowoffsetx,shadowoffsety,strokestyle,textalign,textbaseline* e; ~! [0 H5 y: j: T
24、线性渐变
7 O+ U5 S' S' w; p代码如下:3 W* d2 o" t* d5 H/ i! x7 r
var g=context.createlineargradient(xstart,ystart,xend,yend);4 M- r4 n8 ?2 P: g7 Q7 w7 j
var g1=context.createradialgradient(xstart,ystrat,radiusstrat,xend,yend,radiusend);
8 ?* I( [$ ]2 og.addcolorstop(0,'red');+ l# m- x2 e8 w: `
g.addcolorstop(0,'green');
! R8 D! {6 \, N. C& gcontext.fillstyle=g;. B/ U. a2 J& {* l( U
context.fillrect(0,0,200,200);
* N2 j6 ?8 \1 s3 s
) k% u3 T1 A6 q. C0 r0 h更多网页制作信息请查看: 网页制作

回复|共 9 个

seazvyt 发表于 2016-1-30 13:40:04|比利时 | 查看全部
唉!猪!你怎么了?
wwzcdenleclv 发表于 2016-1-30 13:40:45|英国 | 查看全部
我的我的 忘记了 呵呵
tohme 发表于 2016-1-30 13:41:19|美国 | 查看全部
对自己好点~别难为自己
gevaemaidovef 发表于 2016-1-30 13:41:26|美国 | 查看全部
什么什么啊??
wwzcdenleclv 发表于 2016-2-1 22:05:45|美国 | 查看全部
@,@..是什么意思呀?
mwxny 发表于 2016-2-1 22:06:06|意大利 | 查看全部
下次有人骂我了...我给他还回去..
seazvyt 发表于 2016-2-1 22:06:45|美国 | 查看全部
要相信自己~智商为0
mwxny 发表于 2016-2-1 22:06:50|美国 | 查看全部
哎 天理何在啊??
Acropozelan 发表于 2016-2-1 22:07:02|日本 | 查看全部
小手一抖,经验到手!手拿酱油,低头猛走!酱油党路过,杜绝零回复

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表