现把canvas的知识点总结如下,以便随时查阅。
3 \9 q* j$ e5 k: f1、填充矩形 fillrect(x,y,width,height);! J, f6 E! B3 w. M, F' {; Y
2、绘制矩形边框 strokerect(x,y,width,height);& \+ o4 ?, r0 g4 {* l: I6 z0 i
3、擦除矩形 clearrect(x,y,width,height);' j; D! b0 |' }- S# V" |: @2 K; w
4、填充样式 fillstyle=red; 样式可以为颜色、渐变和图像。$ {# P N6 L% c# B/ B% J: ?
5、描边样式 strokestyle=red;
* z4 p- R5 I+ O% R+ f( q; o: P6、描边线条的宽度 linewidth=4;4 D: [- m# s, t' D/ @
7、线条末端形状 linecap=butt; butt(对接)/round(圆)/square(方),默认情况下是butt;) y, d& k d5 p0 y: K
8、线条相交样式 linejoin=miter; miter(尖角)/round(圆角)/bevel(斜角),默认尖角;
: }6 ?7 |5 r7 z/ ^6 ?- j8 h" x, w9、开始绘制路径 beginpath();- N' X* ` t# w, l4 S+ `" k
10、结束路径 closepath(); 创建路径后,如果想绘制一条连接到路径起点的线条,可以调用closepath(); I; J I4 i% Z- p' `2 c# F8 q! p a
11、绘制圆弧 arc(x,y,radius,startangle,endangle,true/false);
5 P9 r: v7 v" t9 |2 D12、绘制弧线 arcto(x1,y1,x2,y2,radius) 从上一点开始绘制一天弧线,到x2,y2为止,并且以给定的半径radius穿过x1,y1;
# m' u L7 y" O) g( t13、moveto(x,y); 将绘图游标移动到(x,y),不画线5 `& b, T' Q- Q. n, j/ i, o
14、lineto(x,y); 从上一点开始绘制一条直线
0 b6 l5 I( c; K3 A& I' ^/ w" }! x15、二次贝塞尔曲线: quadraticcurveto(cx,cy,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx,cy作为控制点。
/ h$ {' ~+ X4 f' [: s16、三次贝塞尔曲线: beziercurveto(cx1,cy1,cx2,cy2,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx1,cy1和cx2,cy2作为控制点。
# r6 x* C. D! c% A( b) Y2 E( q2 x17、rect(x,y,width,height);从点x,y开始绘制矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是独立形状。
/ c$ L3 \3 H+ K* l: B- \. {18、绘制文本:0 y6 }- z% i' I" d! A8 r
(1) 填充文本:filltext(hello,x,y,width);width为可选的最大像素宽度,如果文本大于最大宽度,则文本会收缩以适应最大宽度。
3 Y$ k1 B7 F; [5 P(2) 文本描边:stroketext(hello,x,y,width);width为可选的最大像素宽度。
3 V5 F* g) `1 G6 D( ](3) 文本样式:font=bold 14px arial;
! k' l! `7 A0 x0 Z% B(4) 水平文本对齐:textalign='start'; // start, end, left,right, center。默认值:start。以文字的起始点(x,y)为基点的纵轴进行对齐。& k/ W+ E$ @' ^: g1 j$ P2 q H
(5) 垂直文本对齐:textbaseline='alphabetic'; //top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic。以文字的起始点(x,y)为基点的横轴进行对齐。
& X, {- y! O$ d: r/ e t; f2 }(6) 文本的宽度:var text=hello; var length=context.measuretext(text);参数text为所需要绘制的文字
' X& U* M/ r" M19、变换8 A, p5 i, H+ `0 z/ S+ ?* m) |7 A
(1) rotate(angle):围绕原点旋转图像angle弧度。# m3 k1 W+ R2 L, C: E/ B' S1 V
也可以使用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);
4 J7 s: f* P9 c* `; r& [% m(2) scale(x,y):缩放图像。也可以使用transform(x,0,0,y,0,0);+ R) G0 p3 [( c
(3) translate(x,y):将坐标原点移动到x,y,执行这个变换之后,坐标0,0会变成之前由x,y表示的点。也可以使用transform(1,0,0,1,x,y);! Z( G$ o$ h# J0 S- w) x( c6 d7 o
(4) transform(<number>, <number>, <number>,<number>,x, y);6 t1 n, s4 t; N H" S: D
(5) settransform(<number>, <number>, <number>,<number>,x, y);将变换矩阵重置为默认状态,然后再调用transform();
; G, G/ W. {4 C' b. f0 E" [; S20、图形组合
7 P |- B9 |+ m. J' g代码如下:
4 Y" D& N# z8 u3 t0 _3 K; fcontext.fillstyle=blue;
% A% ]0 b0 K) i" a1 H( i6 C& f$ Econtext.fillrect(10,10,100,100);+ e. Y, H6 ~7 t" q' \# m5 u b# y
context.globalcompositeoperation='lighter'; 可选值如/* */内。
0 Y# h' O1 l w4 o3 hcontext.fillstyle=red;) c% ]5 f3 H _, I" l
context.arc(110,60,50,0,math.pi*2,false);' F) @- n$ U& F' q+ G* u
context.fill();! }1 a- o" m2 k( y
/*
* k3 x: E" _; ?2 Q& Y5 \1 lsource-over(默认值):6 A) X) P# V- V2 E
destination-over:在原有图形之下绘制新图形+ l; x1 v. X5 ~8 k) Z! q7 K
source-in:新图形与原有图形作in运算,只显示新图形中与原有图形相重叠的部分+ [/ T- c4 q r5 k
destination-in:原有图形与新图形作in运算,只显示新图形中与原有图形相重叠的部分7 o+ x& t: M& c4 u# P( N) b! n
source-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分 ]( o# e, g- I. L
destination-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分: l9 X7 E2 w. F0 |# E! P
source-atop:只绘制新图形中与原有图形重叠的部分和未被重叠的原有图形1 b( E6 R0 Z. k4 l/ ` m
destination-atop:只绘制原有图形中被新图形重叠的部分和新图形的其他部分' D. B# J3 G( e* H. B, _% Z" N
lighter:原有图形与新图形均绘制,重叠部分做加色处理; j! h- }6 `! `" b" Y
xor:只绘制新图形与原有图形不重叠的部分,重叠部分变透明6 U! P/ a7 F+ z, a( n$ l! J9 G; o
copy:只绘制新图形
6 g, U- b7 G' }2 p5 f7 H, J! e*/
T6 ~7 d8 z, L' }; G5 m21、绘制图形阴影
2 X: K/ W9 j7 A$ E9 T/ C' E- a代码如下:: I2 h! p; H) v0 Z% y1 V( q
context.shadowoffsetx=10; //阴影的横向位移量 Y! D( ~' t2 p3 v
context.shadowoffsety=10; //阴影的纵向位移量
) o6 X; }6 e xcontext.shadowcolor='rgba(100,100,100,0.5)'; //阴影的颜色
, u: _3 X1 b( P+ I5 `context.shadowblur=7; //阴影的模糊范围
& ]" R) a% X# u+ f8 ]22、绘制、平铺、裁剪图像6 e, }4 D0 f; F, H0 V0 K2 G& n
代码如下:
( W* k' R4 [$ B! ?( Gcontext.drawimage(image,x,y);( u$ E+ N; W" n+ V8 A+ Z Z
context.drawimage(image,x,y,w,h);
" D, M* l" o9 t7 J7 F+ l! Ncontext.drawimage(image,sx,sy,sw,sh,dx,dy,dw,dh);sx,sy和sw,sh为源图像的被复制区域的起始坐标和高度,dx,dy和dw,dh为复制后的区域的目标坐标和高度。
7 u& K9 n: A Y v( |& Y. Wcontext.createpattern(image,type);图像平铺,参数可以为:no-repeat,repeat-x,repeat-y,repeat;
& a" |( G+ i3 ^) ?context.clip(); //裁剪功能/ l- S' n/ Z: S; {3 w, Y5 O0 t3 A
例子:9 ]8 H6 Z6 w8 G; l- p
代码如下:
( \: |9 k2 B1 j F9 Yimage=new image(); //创建image对象
6 p, a R3 m: o1 q* T) vimage.src=../images/wukong.gif;* t1 V7 i& [0 e( Y. n
var test=context.createpattern(image,'repeat-y');//createpattern设置平铺效果,
# w k- H/ O- s; b y# @$ u0 jcontext.fillstyle=test;2 H. ?6 e. W0 [" U0 u4 L
context.fillrect(0,0,400,400);# V7 S$ L% G) a& X# {7 q' J! o, }
image.onload=function() { //此方法的作用是,如果图片是比较大的网络图像文件,防止图像全部装载完毕才看见该图像,这样就可以一边装载一边绘制了。
* Y. y* C6 y Z6 n0 k7 H) tdrawimg(context,image);$ S# C3 a! f# j" h- x
}4 B7 F( |2 q: e6 G+ B1 J& }/ ~7 ~
function drawimg(context,image){ ?2 J2 E* @2 _4 `4 S, _3 Y
//绘制原始图像6 K& L, y$ ?& j& l
context.drawimage(image,10,10,125,125);
* Z i3 F6 g$ {# K* ]//局部放大4 ~: k# G# T) t0 _( V4 a5 n
context.drawimage(image,20,0,90,100,150,10,125,125);
$ n, V1 u+ a/ S, @1 vcontext.rect(20,20,80,80);1 h0 {* b0 R, B6 @
context.clip();- f9 S& k9 t$ |4 ~, {
context.drawimage(image,0,0,200,200);7 ^4 q" a8 X% Y8 j) B8 X6 `
}6 R5 Y; s" ]' ?9 A/ G$ N( e+ H
23、保存、恢复
! X9 [5 E% v* L* Rcontex.save();将当前状态保存到栈中。注意:保存的只是对绘制图形的设置和变换,不会保存绘制图形的内容。
3 ?7 u3 R) p- p) I; Fcontext.restore();从栈中取出之前保存的图形状态
& G9 }+ B& _; B( v& j! r可以应用的场合:
0 j p0 \! G, `) A9 n2 y: `- ](1)图像或图形变形
/ R. r8 y' W$ M(2)图像裁剪$ K! I8 r1 K z( h4 \* C/ [3 @
(3)改变图形上下文时属性时:fillstyle,font,globalalpha,globalcomposite-operation,linecap,linejoin,linewidth,miterlimit,shadowblur,shadowcolor,6 ?; r9 x8 G$ k! d! i; s. x
shadowoffsetx,shadowoffsety,strokestyle,textalign,textbaseline( g, L. j- E2 P1 t, V7 V1 r
24、线性渐变
% @% s0 H4 l' v# i# \' o' @5 k代码如下:
3 ]1 G7 F! P. }. {3 Mvar g=context.createlineargradient(xstart,ystart,xend,yend);
0 \% H8 [, \( H. t- tvar g1=context.createradialgradient(xstart,ystrat,radiusstrat,xend,yend,radiusend);; \1 R7 o6 f' r. v6 z
g.addcolorstop(0,'red');
/ B' v, Y' u$ F1 Dg.addcolorstop(0,'green');& S6 z# }: z& F" K3 r3 ]
context.fillstyle=g;0 B9 d8 K! x8 t% \7 ^3 T; P. J) e( u
context.fillrect(0,0,200,200);
! O0 T: [9 z& S1 y! D
0 S# ~* k% i8 G# [) w更多网页制作信息请查看: 网页制作 |
|