返回列表 发新帖

24个canvas基础知识小结

364.0k 9
swmozowtfl 发表于 2015-7-26 20:46:06|湖北 | 查看全部 阅读模式
现把canvas的知识点总结如下,以便随时查阅。
2 F' K% O! p% h* u5 c1、填充矩形 fillrect(x,y,width,height);
0 `9 c8 |' m5 A2、绘制矩形边框 strokerect(x,y,width,height);
$ L! S4 g8 O! H( s3、擦除矩形 clearrect(x,y,width,height);
$ W4 c9 R/ e+ _2 c, `/ `7 [: U! S% a4、填充样式 fillstyle=red; 样式可以为颜色、渐变和图像。
2 u  n5 @; d9 C8 M, e3 g7 w& q5、描边样式 strokestyle=red;0 O6 r# `( r: {5 e7 O
6、描边线条的宽度 linewidth=4;
4 ^# U8 |& x# ^; u) x$ C+ H) M7、线条末端形状 linecap=butt; butt(对接)/round(圆)/square(方),默认情况下是butt;
! ~+ A" x$ k/ c/ }6 u8 z8、线条相交样式 linejoin=miter; miter(尖角)/round(圆角)/bevel(斜角),默认尖角;
% m& x4 W$ E: M5 b5 w) |5 t9、开始绘制路径 beginpath();
/ P1 b2 M& G, S' c4 @7 `10、结束路径 closepath(); 创建路径后,如果想绘制一条连接到路径起点的线条,可以调用closepath();3 u) g( Y& S) ]% j% |
11、绘制圆弧 arc(x,y,radius,startangle,endangle,true/false);. F- Y# U0 ~7 D6 |' ]! B. x, I& x
12、绘制弧线 arcto(x1,y1,x2,y2,radius) 从上一点开始绘制一天弧线,到x2,y2为止,并且以给定的半径radius穿过x1,y1;- w7 B/ ~/ z* K' A: H; y, m: i
13、moveto(x,y); 将绘图游标移动到(x,y),不画线5 E2 p( R0 S% y6 y
14、lineto(x,y); 从上一点开始绘制一条直线$ [: U0 K- j( `
15、二次贝塞尔曲线: quadraticcurveto(cx,cy,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx,cy作为控制点。
9 J3 S! @6 d8 B4 U& d% |16、三次贝塞尔曲线: beziercurveto(cx1,cy1,cx2,cy2,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx1,cy1和cx2,cy2作为控制点。0 v: y! m4 _/ M# C4 j, T
17、rect(x,y,width,height);从点x,y开始绘制矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是独立形状。
# Y9 c9 B. W1 n2 J4 e0 d18、绘制文本:
; g6 ?+ G- q3 v, b+ |(1) 填充文本:filltext(hello,x,y,width);width为可选的最大像素宽度,如果文本大于最大宽度,则文本会收缩以适应最大宽度。
4 ]( ~, Y3 t. R0 V(2) 文本描边:stroketext(hello,x,y,width);width为可选的最大像素宽度。
' w& n4 l/ Z+ H" m' }(3) 文本样式:font=bold 14px arial;
6 t. |; ~; L- N" r, l2 d(4) 水平文本对齐:textalign='start'; // start, end, left,right, center。默认值:start。以文字的起始点(x,y)为基点的纵轴进行对齐。
- v% @  z7 p5 I- ^(5) 垂直文本对齐:textbaseline='alphabetic'; //top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic。以文字的起始点(x,y)为基点的横轴进行对齐。
+ G( J6 r4 Z% d(6) 文本的宽度:var text=hello; var length=context.measuretext(text);参数text为所需要绘制的文字
/ O5 x9 Y# ]/ d! Y' M& L19、变换3 I# ]# u9 I( M6 R! g
(1) rotate(angle):围绕原点旋转图像angle弧度。
& D! G' O8 j: D3 P  B8 g3 d' G也可以使用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);# k( l# `5 d8 x! ~. m- q
(2) scale(x,y):缩放图像。也可以使用transform(x,0,0,y,0,0);% g5 ^8 z# |0 C, B/ ~! o
(3) translate(x,y):将坐标原点移动到x,y,执行这个变换之后,坐标0,0会变成之前由x,y表示的点。也可以使用transform(1,0,0,1,x,y);+ n: u9 N% u" @# @! }
(4) transform(<number>, <number>, <number>,<number>,x, y);) R' F, m+ L8 t4 h9 ~: Z1 S! `
(5) settransform(<number>, <number>, <number>,<number>,x, y);将变换矩阵重置为默认状态,然后再调用transform();) l% z' p0 \. _  V6 W; ~
20、图形组合
  O" n" n6 F& ]7 k2 A代码如下:
3 B6 G4 O# N/ L0 M7 h# H$ C& v
context.fillstyle=blue;
6 u* R3 i1 ^6 X7 `" @) Rcontext.fillrect(10,10,100,100);
' z8 _& Y) K4 |context.globalcompositeoperation='lighter'; 可选值如/* */内。1 U- X) m& m, f! ?' {# R* q
context.fillstyle=red;
* y. h& D( h- L6 B; m4 S3 j8 jcontext.arc(110,60,50,0,math.pi*2,false);- k0 W" u2 P: Q/ B4 `
context.fill();# S+ E+ `, s/ s; b9 t; m
/*8 K. d* B! n, O! P0 `4 \2 a% j" L2 M
source-over(默认值):
+ {6 R+ s- v' U% x. |& gdestination-over:在原有图形之下绘制新图形3 k; j# x6 M$ L: l7 c
source-in:新图形与原有图形作in运算,只显示新图形中与原有图形相重叠的部分* I% w/ F+ ^" S- W" F- _. [. e5 E; F
destination-in:原有图形与新图形作in运算,只显示新图形中与原有图形相重叠的部分
4 w" J( g8 m  _" ssource-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分- B' L0 U! f7 i; o- q. f: V7 s
destination-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分0 L( b! u) A, ^8 a
source-atop:只绘制新图形中与原有图形重叠的部分和未被重叠的原有图形5 E4 k( g- w* e* {1 e0 [
destination-atop:只绘制原有图形中被新图形重叠的部分和新图形的其他部分
. X, A3 Z* Y! f0 o& a3 Hlighter:原有图形与新图形均绘制,重叠部分做加色处理$ a! q# B) E- W# n% I
xor:只绘制新图形与原有图形不重叠的部分,重叠部分变透明
* x6 }/ Q% w; o% P. zcopy:只绘制新图形0 ?/ w, a  m" W! T# G) p5 K
*/
  A1 [% Z0 x4 u21、绘制图形阴影: i# i' v, m7 s3 O
代码如下:
2 A% F% _; C" }7 b$ P2 j6 c4 F
context.shadowoffsetx=10; //阴影的横向位移量5 i/ Z) }8 J+ Y/ \
context.shadowoffsety=10; //阴影的纵向位移量$ e: b/ W" ]& f' G* p
context.shadowcolor='rgba(100,100,100,0.5)'; //阴影的颜色3 X3 N7 R, j, O& l/ W9 V0 Z! t
context.shadowblur=7; //阴影的模糊范围
3 U1 Z3 d) s: T7 \22、绘制、平铺、裁剪图像  Y8 d9 r: X, x) v0 d: D; K
代码如下:  e7 |# b' W+ I( l1 \
context.drawimage(image,x,y);6 m1 V# x/ v5 }8 r9 t7 Q) L- z
context.drawimage(image,x,y,w,h);
9 ~: Z1 F" n$ w: \context.drawimage(image,sx,sy,sw,sh,dx,dy,dw,dh);sx,sy和sw,sh为源图像的被复制区域的起始坐标和高度,dx,dy和dw,dh为复制后的区域的目标坐标和高度。. O2 M. _& y' k% T9 ?+ q
context.createpattern(image,type);图像平铺,参数可以为:no-repeat,repeat-x,repeat-y,repeat;5 R1 Z  j! L5 S7 u) Y8 ?
context.clip(); //裁剪功能/ j7 C1 I5 K7 a7 E& M7 S
例子:
, n. I: k4 n6 Z3 O" Z代码如下:
/ C7 Q; K: M: i* r/ ~: A
image=new image(); //创建image对象
$ n" r- z  r0 |5 Pimage.src=../images/wukong.gif;
& r* ^4 y$ l$ U% w9 u) Nvar test=context.createpattern(image,'repeat-y');//createpattern设置平铺效果,- D! Q2 [3 C  J7 `# p( {
context.fillstyle=test;
7 f. f9 V8 h* ccontext.fillrect(0,0,400,400);* h1 r: N/ `! a0 n& }4 N
image.onload=function() { //此方法的作用是,如果图片是比较大的网络图像文件,防止图像全部装载完毕才看见该图像,这样就可以一边装载一边绘制了。7 A# }2 F% b6 z& o/ l- k
drawimg(context,image);/ G& k; d) t$ z! h% i
}
1 ?  G" F) I, t4 X/ y5 {6 Pfunction drawimg(context,image){
3 X" C2 W. n4 E' O//绘制原始图像
; ^/ K3 O7 h( n$ g$ U' q3 Jcontext.drawimage(image,10,10,125,125);
1 ~( D; _' U9 k* F4 [//局部放大
+ A; X9 r+ b3 ucontext.drawimage(image,20,0,90,100,150,10,125,125);2 @9 @% k1 s) K3 W- }& H
context.rect(20,20,80,80);
  U8 z2 _3 t: C' dcontext.clip();
: ]7 x! G& O* n  l  pcontext.drawimage(image,0,0,200,200);) G6 ]7 j; ?8 C$ n' V
}
1 r4 e4 f6 w# V$ [23、保存、恢复- o. K- O3 x9 p7 M
contex.save();将当前状态保存到栈中。注意:保存的只是对绘制图形的设置和变换,不会保存绘制图形的内容。" i4 t# T0 K! t
context.restore();从栈中取出之前保存的图形状态& p8 w4 D6 W* F0 o
可以应用的场合:7 ]) i4 g' w9 e5 d4 Y
(1)图像或图形变形
2 X; f- t. d6 D, \(2)图像裁剪
: J/ Z( ?7 O& o(3)改变图形上下文时属性时:fillstyle,font,globalalpha,globalcomposite-operation,linecap,linejoin,linewidth,miterlimit,shadowblur,shadowcolor,; _  j! ~1 [1 [9 H% u
shadowoffsetx,shadowoffsety,strokestyle,textalign,textbaseline0 Y( F: t8 l! W/ h) T  v! E
24、线性渐变
  |1 ~" u; S- b: j代码如下:
3 x2 N1 o3 ^- d, O$ M% A- Q
var g=context.createlineargradient(xstart,ystart,xend,yend);! n$ @& V) R; }
var g1=context.createradialgradient(xstart,ystrat,radiusstrat,xend,yend,radiusend);
5 F- t. b) e+ m& ^) c% \g.addcolorstop(0,'red');/ w! }# W% y, T) h
g.addcolorstop(0,'green');2 q8 j" }6 X% l' h. c3 L" ~: M3 S
context.fillstyle=g;
0 T2 x% t! m9 ~9 n( d' X! lcontext.fillrect(0,0,200,200);7 s+ S8 J) i6 a/ ?6 z8 @
* e3 j  ]) p/ u! ~1 ]( [- f
更多网页制作信息请查看: 网页制作

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表