返回列表 发新帖

24个canvas基础知识小结

363.8k 9
swmozowtfl 发表于 2015-7-26 20:46:06|湖北 | 查看全部 阅读模式
现把canvas的知识点总结如下,以便随时查阅。: v. d7 i% t& ~. l; _
1、填充矩形 fillrect(x,y,width,height);
" V2 Y3 k$ ~0 M0 W0 z. G( B4 q( l2、绘制矩形边框 strokerect(x,y,width,height);
8 ]- c; \# e, V2 l$ c6 M3、擦除矩形 clearrect(x,y,width,height);/ ]. t8 V8 N" s# C
4、填充样式 fillstyle=red; 样式可以为颜色、渐变和图像。
& w' J. z, v  }3 S5、描边样式 strokestyle=red;
: \9 b8 D% e% t' y! i3 y. w) ~6、描边线条的宽度 linewidth=4;
( L' K% G9 S5 D+ c! w7 _) J# O7、线条末端形状 linecap=butt; butt(对接)/round(圆)/square(方),默认情况下是butt;3 W/ Z1 C: I: J% V! j2 z/ S
8、线条相交样式 linejoin=miter; miter(尖角)/round(圆角)/bevel(斜角),默认尖角;- C3 Y; {+ e$ \7 W
9、开始绘制路径 beginpath();
8 i5 J3 u2 l& {$ U/ ^4 Q+ o9 g10、结束路径 closepath(); 创建路径后,如果想绘制一条连接到路径起点的线条,可以调用closepath();
8 U/ D( K$ I+ U/ f6 o% ?9 ~11、绘制圆弧 arc(x,y,radius,startangle,endangle,true/false);
8 B1 ]" j% M# c. s1 {12、绘制弧线 arcto(x1,y1,x2,y2,radius) 从上一点开始绘制一天弧线,到x2,y2为止,并且以给定的半径radius穿过x1,y1;4 {4 D" r3 j' m: [, s
13、moveto(x,y); 将绘图游标移动到(x,y),不画线: j6 l4 d  `) q: D1 i
14、lineto(x,y); 从上一点开始绘制一条直线# s1 j4 d# K3 v2 b
15、二次贝塞尔曲线: quadraticcurveto(cx,cy,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx,cy作为控制点。2 D" M6 d3 N$ {
16、三次贝塞尔曲线: beziercurveto(cx1,cy1,cx2,cy2,x,y); 从上一点开始绘制二次曲线,到x,y为止,cx1,cy1和cx2,cy2作为控制点。
. A6 y$ I; d) D& O0 q17、rect(x,y,width,height);从点x,y开始绘制矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是独立形状。/ y8 ]9 ]% `9 g! k2 R
18、绘制文本:5 t1 e4 C& {4 x) F2 N9 A- h% ^# ^1 p
(1) 填充文本:filltext(hello,x,y,width);width为可选的最大像素宽度,如果文本大于最大宽度,则文本会收缩以适应最大宽度。
/ z4 k. k2 T0 w7 ?5 U(2) 文本描边:stroketext(hello,x,y,width);width为可选的最大像素宽度。
1 V6 j  W$ U; i1 q& E(3) 文本样式:font=bold 14px arial;/ N* A& i1 u5 K: n- S3 H
(4) 水平文本对齐:textalign='start'; // start, end, left,right, center。默认值:start。以文字的起始点(x,y)为基点的纵轴进行对齐。+ W* i+ h" h* B
(5) 垂直文本对齐:textbaseline='alphabetic'; //top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic。以文字的起始点(x,y)为基点的横轴进行对齐。3 p/ @7 u7 Y/ I! ]. l
(6) 文本的宽度:var text=hello; var length=context.measuretext(text);参数text为所需要绘制的文字
. K% j( d6 e8 D# S5 a. u. A! c9 v) g; ^19、变换
9 n7 R+ w) c% l( u$ {(1) rotate(angle):围绕原点旋转图像angle弧度。
' n2 z9 @& [) b也可以使用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);
& x5 `, G% g9 I" r) K7 p(2) scale(x,y):缩放图像。也可以使用transform(x,0,0,y,0,0);8 H, u, k; p+ f$ Z) H/ m: p/ Y, X: k
(3) translate(x,y):将坐标原点移动到x,y,执行这个变换之后,坐标0,0会变成之前由x,y表示的点。也可以使用transform(1,0,0,1,x,y);8 @9 l. z5 z$ h2 T6 v
(4) transform(<number>, <number>, <number>,<number>,x, y);
+ B* C! {3 f/ r(5) settransform(<number>, <number>, <number>,<number>,x, y);将变换矩阵重置为默认状态,然后再调用transform();
6 ~( f3 U  q8 I5 |7 G20、图形组合
/ N0 O' t) r# w! Q. g代码如下:, o% V/ h% F- t% {
context.fillstyle=blue;
+ Q. ]# E! k' H$ Ocontext.fillrect(10,10,100,100);
1 g9 Y" s. P9 _1 I- u) M1 Q" ucontext.globalcompositeoperation='lighter'; 可选值如/* */内。- C: f; f8 P  h
context.fillstyle=red;7 e3 m& U. H/ |% R' u3 P* y  e
context.arc(110,60,50,0,math.pi*2,false);( e$ y+ I. z* Q# c; O3 \
context.fill();; `$ G6 t' {- o, V- p
/** F9 M9 _( t, O7 C
source-over(默认值):
+ P( f0 h# B- Q3 m" L: \; S8 jdestination-over:在原有图形之下绘制新图形8 }0 m2 v, D6 U6 ]3 S8 \$ h7 t! d
source-in:新图形与原有图形作in运算,只显示新图形中与原有图形相重叠的部分
  x% t  T1 d% k, Rdestination-in:原有图形与新图形作in运算,只显示新图形中与原有图形相重叠的部分
, V. ?5 c. w: k0 \7 W- Lsource-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分
; S7 g. o1 T0 R  [, wdestination-out:新图形与原有图形作out运算,只显示新图形中与原有图形不重叠的部分" Y# ]% [1 Z2 e
source-atop:只绘制新图形中与原有图形重叠的部分和未被重叠的原有图形
( J0 |4 [* c5 t5 Z) g  l; I6 m# Ddestination-atop:只绘制原有图形中被新图形重叠的部分和新图形的其他部分3 H4 g1 B# j# T8 f9 d, w
lighter:原有图形与新图形均绘制,重叠部分做加色处理+ y1 U  X# Q+ ]2 y$ |3 \
xor:只绘制新图形与原有图形不重叠的部分,重叠部分变透明
9 a6 F, ~( v& T' _# Y* g3 ccopy:只绘制新图形+ f4 s8 o9 `' |6 t
*/
/ R* y1 d# Y2 W6 M4 ?21、绘制图形阴影
( D  l0 T' Q. F3 x" ?2 h代码如下:
/ Q1 n" N9 [3 Z. \+ I% Q: h
context.shadowoffsetx=10; //阴影的横向位移量! u, X4 `5 x) B2 m0 k" v0 C
context.shadowoffsety=10; //阴影的纵向位移量
- |  K& ]' X0 Econtext.shadowcolor='rgba(100,100,100,0.5)'; //阴影的颜色: Q. h$ d; z5 X6 L% N9 `
context.shadowblur=7; //阴影的模糊范围" j0 G( M. E5 C) U! T
22、绘制、平铺、裁剪图像8 W4 c/ }8 E0 R" G( A
代码如下:
6 S0 n2 |# @* H0 x( |5 J8 D
context.drawimage(image,x,y);
/ h, w3 e1 [: s" q5 [context.drawimage(image,x,y,w,h);
7 i  H3 V  I! n5 c* n. w8 acontext.drawimage(image,sx,sy,sw,sh,dx,dy,dw,dh);sx,sy和sw,sh为源图像的被复制区域的起始坐标和高度,dx,dy和dw,dh为复制后的区域的目标坐标和高度。! e; V& I) w5 F. d! i
context.createpattern(image,type);图像平铺,参数可以为:no-repeat,repeat-x,repeat-y,repeat;
. Z# q1 @  x9 H: L* K) lcontext.clip(); //裁剪功能0 ~; ]# O" F# O. j+ R5 R/ m& P
例子:
+ d9 s" J+ \/ }: w$ n2 p! W代码如下:
! i% G& r( T2 A- e
image=new image(); //创建image对象
7 V8 W' W/ o- u# D+ Vimage.src=../images/wukong.gif;
, l. B: Y5 s* C0 N, D2 @var test=context.createpattern(image,'repeat-y');//createpattern设置平铺效果,; i3 n8 G9 z8 p" H* N1 z4 Y5 D4 Z
context.fillstyle=test;8 N" B9 `/ R6 [. ?* h
context.fillrect(0,0,400,400);4 v) g$ i- O% e7 P
image.onload=function() { //此方法的作用是,如果图片是比较大的网络图像文件,防止图像全部装载完毕才看见该图像,这样就可以一边装载一边绘制了。! Y# X0 [, p+ v# X1 ?9 r! \  x- I
drawimg(context,image);
4 R) c; t: j2 W9 G, [# U}/ I; ]0 O5 @8 {  v7 f
function drawimg(context,image){
( n( s( ^, d8 f: x6 M: Y//绘制原始图像; S# C, O% ?' }1 e3 Z4 C
context.drawimage(image,10,10,125,125);( r% {7 n% v0 A1 Z: _7 p
//局部放大
: B5 s' G7 B" K1 econtext.drawimage(image,20,0,90,100,150,10,125,125);
- j  P3 y' e. a% a: b. \+ Qcontext.rect(20,20,80,80);
1 B! j  _$ J! o+ dcontext.clip();* g2 W, l, |/ u6 H
context.drawimage(image,0,0,200,200);0 f' J8 x2 l8 Q- S1 v* W
}. K$ x7 Z! k( I5 s$ k- k, l; v$ f
23、保存、恢复5 C9 d# T9 D0 ^' z: a) S7 M0 t: k
contex.save();将当前状态保存到栈中。注意:保存的只是对绘制图形的设置和变换,不会保存绘制图形的内容。
) w  a2 b! k. z* s* r8 S' `1 d7 ^8 }context.restore();从栈中取出之前保存的图形状态
6 o! H" c; B* {0 H9 C3 P可以应用的场合:
! t2 s& [  V4 C$ g- K- F(1)图像或图形变形
4 ~7 N2 n6 j' u; c/ G1 n, K(2)图像裁剪9 x3 h. I0 y1 @: ~
(3)改变图形上下文时属性时:fillstyle,font,globalalpha,globalcomposite-operation,linecap,linejoin,linewidth,miterlimit,shadowblur,shadowcolor,, u/ R. L0 ]5 C6 M4 g
shadowoffsetx,shadowoffsety,strokestyle,textalign,textbaseline) Z3 ?: \: g7 S* B# b+ f; f
24、线性渐变
  ]* }6 w) I2 M  O- E& r- ^# h代码如下:
* X! j7 P: ^6 W' |; J
var g=context.createlineargradient(xstart,ystart,xend,yend);3 @0 B) K5 g3 ~; C0 Q
var g1=context.createradialgradient(xstart,ystrat,radiusstrat,xend,yend,radiusend);
  b' {1 J+ H5 ^4 {' Q& qg.addcolorstop(0,'red');
+ e$ F3 q( o" d( Z; ^7 jg.addcolorstop(0,'green');: @9 ]5 x& g% b8 K
context.fillstyle=g;, ?+ ]( T2 y4 z/ a) G
context.fillrect(0,0,200,200);
  i, k" m* V( E" j
' z9 a6 V; j/ @: x/ p" e更多网页制作信息请查看: 网页制作

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