返回列表 发新帖

24个canvas基础知识小结

363.7k 9
swmozowtfl 发表于 2015-7-26 20:46:06|湖北 | 查看全部 阅读模式
现把canvas的知识点总结如下,以便随时查阅。
+ X  G% }! H1 O" D  _1、填充矩形 fillrect(x,y,width,height);0 x) V6 V  J2 p  z  g8 C
2、绘制矩形边框 strokerect(x,y,width,height);
, m: B! e( A) C  i( I! x  t3、擦除矩形 clearrect(x,y,width,height);
2 o- r8 ?. R% T4、填充样式 fillstyle=red; 样式可以为颜色、渐变和图像。- x8 z4 @  c, _; k8 M# s0 [  u. A
5、描边样式 strokestyle=red;
  @' l9 r; `, p) u- z/ K4 y# m6、描边线条的宽度 linewidth=4;! G' H) f' N5 _: S  m
7、线条末端形状 linecap=butt; butt(对接)/round(圆)/square(方),默认情况下是butt;* j- _: r' C9 W- ^3 n3 X
8、线条相交样式 linejoin=miter; miter(尖角)/round(圆角)/bevel(斜角),默认尖角;
) \: O2 H2 h+ [! H2 }9、开始绘制路径 beginpath();, ~% \# s4 E6 t
10、结束路径 closepath(); 创建路径后,如果想绘制一条连接到路径起点的线条,可以调用closepath();
# t4 \# b2 I0 ^0 Q' ]  W11、绘制圆弧 arc(x,y,radius,startangle,endangle,true/false);
$ e: o7 z: Y. m  i8 Z; H12、绘制弧线 arcto(x1,y1,x2,y2,radius) 从上一点开始绘制一天弧线,到x2,y2为止,并且以给定的半径radius穿过x1,y1;
( `# W4 l3 L8 M& ~5 w9 e13、moveto(x,y); 将绘图游标移动到(x,y),不画线! d' N: f, U; \
14、lineto(x,y); 从上一点开始绘制一条直线
6 P' u0 U% y6 t7 B15、二次贝塞尔曲线: quadraticcurveto(cx,cy,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx,cy作为控制点。, V5 {2 V1 g/ k- H
16、三次贝塞尔曲线: beziercurveto(cx1,cy1,cx2,cy2,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx1,cy1和cx2,cy2作为控制点。7 X5 ~& x& G, E% v! s: b( r$ |1 v
17、rect(x,y,width,height);从点x,y开始绘制矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是独立形状。
) A$ U8 n8 ~5 }4 v18、绘制文本:
4 @  F( ]! A. H4 f# t(1) 填充文本:filltext(hello,x,y,width);width为可选的最大像素宽度,如果文本大于最大宽度,则文本会收缩以适应最大宽度。9 l# J$ ^9 i% g
(2) 文本描边:stroketext(hello,x,y,width);width为可选的最大像素宽度。
  F% Y" z: I0 u* Y(3) 文本样式:font=bold 14px arial;
  l; v. d0 V7 A3 V' c(4) 水平文本对齐:textalign='start'; // start, end, left,right, center。默认值:start。以文字的起始点(x,y)为基点的纵轴进行对齐。
) Y1 ^3 F7 G7 g(5) 垂直文本对齐:textbaseline='alphabetic'; //top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic。以文字的起始点(x,y)为基点的横轴进行对齐。
! e3 x# v! @. s3 g# E# c4 e, }# r(6) 文本的宽度:var text=hello; var length=context.measuretext(text);参数text为所需要绘制的文字2 r/ `% X2 n& n1 d7 }( W% U
19、变换0 U. n% [! D( J
(1) rotate(angle):围绕原点旋转图像angle弧度。
7 L; y4 L6 C  R2 C. P也可以使用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);
" w2 G: w4 T3 e4 T/ g2 Q(2) scale(x,y):缩放图像。也可以使用transform(x,0,0,y,0,0);0 M+ S" A2 E$ Y& L) F* f7 D! i; s
(3) translate(x,y):将坐标原点移动到x,y,执行这个变换之后,坐标0,0会变成之前由x,y表示的点。也可以使用transform(1,0,0,1,x,y);4 b* D; c% p+ {" Q  V
(4) transform(<number>, <number>, <number>,<number>,x, y);
: V; w- t8 F3 a: a" w2 w! y4 [. H4 w(5) settransform(<number>, <number>, <number>,<number>,x, y);将变换矩阵重置为默认状态,然后再调用transform();/ \) ]# L% y4 M6 y7 w  i; |
20、图形组合0 T0 s: b, H* z- G6 K1 f+ e
代码如下:: q) u& ^/ S$ ~; v7 I: r0 t, v
context.fillstyle=blue;
8 \' [6 x2 s( Y  a) N- ucontext.fillrect(10,10,100,100);6 @5 e- Z; ]7 J# `5 L
context.globalcompositeoperation='lighter'; 可选值如/* */内。
0 |8 t3 N" k7 ?8 ^* |3 C; ?context.fillstyle=red;
% l1 R' {. v5 F) t9 acontext.arc(110,60,50,0,math.pi*2,false);, y, ~  p( F8 h9 k6 d
context.fill();
! o( B# f. e8 L) C9 E. A/*6 `2 |: r$ [4 y$ Y+ y/ b: c& @" p
source-over(默认值):1 ^% R# r' a. \  }& B
destination-over:在原有图形之下绘制新图形. k' [9 }7 c6 V5 w1 Q. D$ K' \
source-in:新图形与原有图形作in运算,只显示新图形中与原有图形相重叠的部分  r' o* N7 q- j' c6 ?/ x
destination-in:原有图形与新图形作in运算,只显示新图形中与原有图形相重叠的部分
" n$ s: x; w+ m+ ysource-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分
( r* \  F% S/ C+ Bdestination-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分; P: N8 v9 g$ G* o# `2 r( C$ X4 ]
source-atop:只绘制新图形中与原有图形重叠的部分和未被重叠的原有图形( p, D- C* m7 m9 ~6 f, Z( C
destination-atop:只绘制原有图形中被新图形重叠的部分和新图形的其他部分
/ Y, c) ~$ I" S- }: w1 T2 a$ Olighter:原有图形与新图形均绘制,重叠部分做加色处理! z1 x8 g5 ?3 `, t2 T' |
xor:只绘制新图形与原有图形不重叠的部分,重叠部分变透明9 j# p7 h3 z$ m0 h# ~# Q6 @
copy:只绘制新图形
& I# y3 P5 O# I9 U) L$ y! f*/
$ l0 \/ y- ]; N, A9 x1 b# H21、绘制图形阴影) ]0 u6 M, }! ]* ~7 [
代码如下:8 d: Y7 Y* E4 E" B5 @- n
context.shadowoffsetx=10; //阴影的横向位移量# W. i) q4 H3 f( \! ]: K- \
context.shadowoffsety=10; //阴影的纵向位移量
" A7 b1 D3 f* [3 acontext.shadowcolor='rgba(100,100,100,0.5)'; //阴影的颜色7 A; L  b- k& v6 D  p' }1 _
context.shadowblur=7; //阴影的模糊范围
8 o# t9 w! @4 K6 y4 s& b22、绘制、平铺、裁剪图像
5 V2 t) U6 p: O( r4 D/ J: T代码如下:- X! O! D/ m7 _' M; L  ~
context.drawimage(image,x,y);- {; ~" {1 i1 V$ S6 u- c5 v
context.drawimage(image,x,y,w,h);' C% H' s, W6 v
context.drawimage(image,sx,sy,sw,sh,dx,dy,dw,dh);sx,sy和sw,sh为源图像的被复制区域的起始坐标和高度,dx,dy和dw,dh为复制后的区域的目标坐标和高度。  d, E5 B* }8 a( v. ]
context.createpattern(image,type);图像平铺,参数可以为:no-repeat,repeat-x,repeat-y,repeat;
8 {3 {8 D  M& \/ u5 zcontext.clip(); //裁剪功能
& p1 ^) I* M2 t% Z+ B. m$ ?8 {4 S# o例子:9 O* T1 d+ C& U( }5 _/ r+ s% R: ]4 e
代码如下:: D- g. T/ l6 B8 Z
image=new image(); //创建image对象
  n# |3 M8 L+ s: v+ `9 @image.src=../images/wukong.gif;* J% Q' O! F" P% X
var test=context.createpattern(image,'repeat-y');//createpattern设置平铺效果,# A$ I7 ~& k, e  y$ j3 U) M
context.fillstyle=test;
; C: S1 @) l) x' }2 x  N# Vcontext.fillrect(0,0,400,400);2 N  q" I$ X0 n+ x' g; j  G$ I
image.onload=function() { //此方法的作用是,如果图片是比较大的网络图像文件,防止图像全部装载完毕才看见该图像,这样就可以一边装载一边绘制了。
8 O4 x. z' q& y# V7 Wdrawimg(context,image);3 _8 c0 v; m9 d' I5 L+ J: [
}
" f+ A7 K- L0 V3 D; A7 B3 }function drawimg(context,image){
( `" g) _: E5 [% N//绘制原始图像
4 r" e! C' O  I/ @context.drawimage(image,10,10,125,125);1 ~0 D. K0 O9 q% M7 H  A/ B, t: b
//局部放大
4 r& v9 R% j: P; gcontext.drawimage(image,20,0,90,100,150,10,125,125);. N/ ]/ ~& f7 X' P0 {1 A
context.rect(20,20,80,80);( m  e7 p5 w4 N4 z5 j
context.clip();7 r8 F/ e+ f+ f! h* |+ f3 \
context.drawimage(image,0,0,200,200);
( l' A1 J) i$ ~- I& J1 o}
) }: x5 Q; {5 y0 U  `) x! A23、保存、恢复
4 R8 ]$ g( U6 ?; b  Rcontex.save();将当前状态保存到栈中。注意:保存的只是对绘制图形的设置和变换,不会保存绘制图形的内容。
9 Y2 h! x- [5 Z  K8 C' L- I* {+ Gcontext.restore();从栈中取出之前保存的图形状态
  N! S2 |1 R0 R" t% e6 f3 F, b可以应用的场合:$ b2 h2 x0 _$ w4 [# d+ C! W; s
(1)图像或图形变形0 Z4 I7 W* N, R" h# }( I
(2)图像裁剪! g9 c! b( g/ O1 T: n+ \
(3)改变图形上下文时属性时:fillstyle,font,globalalpha,globalcomposite-operation,linecap,linejoin,linewidth,miterlimit,shadowblur,shadowcolor,
7 a0 T2 r1 [( J, V% eshadowoffsetx,shadowoffsety,strokestyle,textalign,textbaseline$ e" `/ W: d6 N7 ?9 L
24、线性渐变
+ O8 r' \' ]! B代码如下:
2 M4 W& w4 s2 a6 d9 [+ N/ w
var g=context.createlineargradient(xstart,ystart,xend,yend);
1 j) D) F" V" E0 O; Rvar g1=context.createradialgradient(xstart,ystrat,radiusstrat,xend,yend,radiusend);
# d3 A# G' i8 k/ q& {5 Gg.addcolorstop(0,'red');; ?% [6 }4 _' i: L% `
g.addcolorstop(0,'green');
; p: [! u! S5 Y* d" u1 Z. h8 y" mcontext.fillstyle=g;
0 R; R) I! C6 {' w$ {* l2 U% [context.fillrect(0,0,200,200);
8 V9 s2 H+ U! Y. B9 N
8 E/ K4 v8 H7 i% B$ R更多网页制作信息请查看: 网页制作

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