pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5 CANVAS:繪制路徑

一條HTML5 canvas路徑是通過(guò)繪制指令來(lái)連接一系列的點(diǎn),由這一系列的點(diǎn)構(gòu)成直線或曲線。路徑可以用于在HTML5 canvas上繪制各種類(lèi)型的圖形:直線、圓形、多邊形等等。 ...,HTML5中國(guó),中
1.jpg

  一條HTML5 canvas路徑是通過(guò)繪制指令來(lái)連接一系列的點(diǎn),由這一系列的點(diǎn)構(gòu)成直線或曲線。路徑可以用于在HTML5 canvas上繪制各種類(lèi)型的圖形:直線、圓形、多邊形等等。路徑的繪制是canvas的核心,必須很好的理解和掌握。

  開(kāi)始和關(guān)閉一條路徑

  要開(kāi)始和關(guān)閉一條路徑可以使用2D上下文的beginPath()和closePath()函數(shù)。例如下面的例子:
  1. var canvas  = document.getElementById("ex1");
  2. var context = canvas.getContext("2d");

  3. context.beginPath();

  4. //... 繪制路徑

  5. context.closePath();      
復(fù)制代碼

  moveTo()函數(shù)

  當(dāng)你在canvas中繪制一條路徑的時(shí)候,你可以想象自己正在使用一支“虛擬筆”。這支虛擬筆總是位于某個(gè)位置,你可以使用2D上下文的moveTo(x, y)函數(shù)來(lái)移動(dòng)這支虛擬筆。例如下面的代碼:
  1. context.moveTo(10,10);         
復(fù)制代碼

  這個(gè)例子將“虛擬筆”移動(dòng)到(10,10)這個(gè)坐標(biāo)點(diǎn)上。

  lineTo()函數(shù)

  lineTo函數(shù)用于從虛擬筆的當(dāng)前位置繪制一條直線到lineTo()函數(shù)中指定的點(diǎn)。下面是一個(gè)例子:
  1. context.beginPath();

  2. context.moveTo(10,10);
  3. context.lineTo(50,50);

  4. context.closePath();   
復(fù)制代碼

  這個(gè)例子中首先移動(dòng)虛擬筆到(10,10)坐標(biāo)點(diǎn)位置,然后從這個(gè)點(diǎn)繪制一條直線到(50,50)坐標(biāo)點(diǎn)。

  lineTo()函數(shù)還會(huì)將虛擬筆移動(dòng)到執(zhí)行的結(jié)束點(diǎn)位置。上面的例子中是移動(dòng)到(50,50)的位置。

  stroke()函數(shù) + fill()函數(shù)

  在你沒(méi)有通知2D上下文繪制路徑之前,實(shí)際是不會(huì)在畫(huà)布上繪制任何東西的。你可以通過(guò)stroke()或fill()函數(shù)來(lái)通知2D上下文。

  stroke()函數(shù)用于路徑操作指定的圖形的外輪廓。

  fill()函數(shù)用于填充有路徑操作指定的圖形。

  下面的例子展示了stroke()或fill()函數(shù)的用法。
  1. context.beginPath();
  2. context.moveTo(10,10);
  3. context.lineTo(60,50);
  4. context.lineTo(110,50);
  5. context.lineTo(10,10);
  6. context.stroke();
  7. context.closePath();

  8. context.beginPath();
  9. context.moveTo(100,10);
  10. context.lineTo(150,50);
  11. context.lineTo(200,50);
  12. context.lineTo(100,10);
  13. context.fill();
  14. context.closePath();   
復(fù)制代碼

  上面代碼的返回結(jié)果如下:

2.jpg

  線條的寬度

  你可以使用2D上下文的lineWidth屬性來(lái)設(shè)置繪制線條的寬度。下面是一個(gè)例子:
  1. context.lineWidth = 10;            
復(fù)制代碼

  上面的例子設(shè)置繪制線條的寬度為10像素。

  下面的例子繪制3條直線,它們的寬度分別為1,5和10。

3.jpg

  當(dāng)你繪制的線條寬度大于1的時(shí)候,擴(kuò)展的線條寬度將平均分配在線條中心線的兩側(cè)。距離來(lái)說(shuō),如果你從(10,10)這個(gè)點(diǎn)繪制一條直線到(100,10)這個(gè)點(diǎn),線條的寬度為10,那么,實(shí)際上是從(10,5)這個(gè)點(diǎn)開(kāi)始繪制,然后擴(kuò)展到(10,15)這個(gè)點(diǎn),在水平繪制到(100,5)和(100,15)這兩個(gè)點(diǎn),就像是繪制一個(gè)矩形。

  線條的線條(LINE CAP)

  在使用路徑來(lái)繪制線條的時(shí)候,你可以設(shè)置線條的線頭樣式。線頭的樣式通過(guò)2D上下文的lineCap屬性來(lái)設(shè)置。它有三個(gè)可選值:

  •   butt
  •   round
  •   square

  butt樣式的線頭是扁平且和線正交的樣式。

  round樣式的線頭是一個(gè)圓角的線頭,圓的半徑等于線條寬度的一半。

  square樣式的線頭會(huì)在線的末端繪制一個(gè)矩形。矩形的大小為:線條的寬度 X 線條的寬/2。

  下面是幾個(gè)不同線頭樣式的線條的例子。所有的線條的寬度都是10。最總版的一組線條的lineCap的取值為butt,中間的一組線條的lineCap的取值為round,最右邊的一組線條的lineCap的取值為square。

4.jpg

  lineCap的取值butt和square非常相似。有時(shí)難以區(qū)別。這里制作了幾個(gè)小例子,從這些例子中你可以看出它們之間的微小差別。下面又三組線條,每一組左邊(或上邊)的線條的lineCap屬性取值為butt,右邊(或下邊)的線條的lineCap屬性取值為square。

5.jpg

  正如上面的結(jié)果所示,square線頭的線條要比butt線頭的線條要長(zhǎng)。

  線條的連接

  2D上下文的lineJoin屬性用于定義兩條線條連接處的點(diǎn)如何繪制。兩條線條連接處的點(diǎn)被稱(chēng)為“連接點(diǎn)”。lineJoin屬性有下面的三種取值:

  •   miter
  •   bevel
  •   round

  下面是這三種取值的示例代碼:
  1. context.lineJoin = "miter";
  2. context.lineJoin = "bevel";
  3. context.lineJoin = "round";         
復(fù)制代碼

  miter的連接點(diǎn)是一個(gè)三角形的連接點(diǎn)。

  bevel的連接點(diǎn)是一個(gè)平頭的連接點(diǎn)。

  round的連接點(diǎn)是一個(gè)圓角的連接點(diǎn)。

  下面分別是三種線條連接點(diǎn)的例子,從左到右的lineJoin屬性分別是:miter,bevel和round。

6.jpg

  繪制曲線

  2D上下文的arc()函數(shù)可以用于繪制一條曲線。arc()函數(shù)有6個(gè)參數(shù):

  •   x:圓弧的中心點(diǎn)的X坐標(biāo)位置。
  •   y:圓弧的中心點(diǎn)的Y坐標(biāo)位置。
  •   radius:圓弧的半徑。
  •   startAngle:圓弧開(kāi)始的角弧度。
  •   endAngle:圓弧結(jié)束的角弧度。
  •   anticlockwise:設(shè)置是以順時(shí)針還是逆時(shí)針繪制圓弧,false為順時(shí)針。

  下面是一段示例代碼:
  1. context.lineWidth = 3;

  2. var x = 50;
  3. var y = 50;
  4. var radius = 25;
  5. var startAngle = (Math.PI / 180) * 45;
  6. var endAngle   = (Math.PI / 180) * 180;
  7. var anticlockwise = false;

  8. context.beginPath();
  9. context.arc(x, y, radius, startAngle, endAngle, anticlockwise);
  10. context.stroke();
  11. context.closePath();   
復(fù)制代碼

  上面的代碼繪制了一條弧線,它的中心點(diǎn)位于(50,50)坐標(biāo)點(diǎn),半徑為25,從45度開(kāi)始到180度結(jié)束。

  下面是上面代碼的返回結(jié)果:

7.jpg

  上面的例子如果將anticlockwise設(shè)置為true,會(huì)得到下面的結(jié)果:

8.jpg

  如果你要花一個(gè)完整的圓,可以簡(jiǎn)單的設(shè)置startAngle為0,endAngle設(shè)置為2 * Math.PI,它相當(dāng)于(Math.PI / 180) * 360。

  arcTo()函數(shù)

  2D上下文中有一個(gè)arcTo()函數(shù),它用于從當(dāng)前的點(diǎn)繪制一條曲線到參數(shù)指定的點(diǎn),曲線的半徑也由參數(shù)指定。它的語(yǔ)法為:arcTo(x1, y1, x2, y2, radius)。注意:參數(shù)中x1, y1, x2, y2指的是這個(gè)點(diǎn)的控制點(diǎn)。arcTo()函數(shù)可以使用lineTo()和arc函數(shù)來(lái)模仿。

  quadraticCurveTo()函數(shù)

  quadraticCurveTo()函數(shù)用于繪制一條二次貝茲曲線。這條曲線由一個(gè)控制點(diǎn)來(lái)控制,它的語(yǔ)法為:quadraticCurveTo(cp1x, cp1y, x, y)。下面是一個(gè)示例代碼:
  1. context.lineWidth = 3;

  2. var fromX = 50;
  3. var fromY = 50;
  4. var toX   = 100;
  5. var toY   = 50;
  6. var cpX   = 75;
  7. var cpY   = 100;

  8. context.beginPath();
  9. context.moveTo(fromX, fromY);
  10. context.quadraticCurveTo(cpX, cpY, toX, toY);
  11. context.stroke();
  12. context.closePath();         
復(fù)制代碼

  上面的代碼繪制一條從(50,50)開(kāi)始到(100,50)的二次貝茲曲線,這條曲線的控制點(diǎn)為(75,100)。得到的結(jié)果如下所示:

9.jpg

  仔細(xì)看,在曲線下方有一個(gè)小點(diǎn),那是這條曲線的控制點(diǎn)。(這個(gè)點(diǎn)是專(zhuān)門(mén)繪制出來(lái)讓大家看的)


  關(guān)于控制點(diǎn),可以參考下面的圖像:


10.jpg

  bezierCurveTo()函數(shù)

  bezierCurveTo()函數(shù)用于從一個(gè)點(diǎn)到另一個(gè)點(diǎn)繪制一條三次貝茲曲線。三次貝茲曲線有兩個(gè)控制點(diǎn),而二次貝茲曲線只有一個(gè)控制點(diǎn)。它的語(yǔ)法為:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)。下面是一個(gè)例子:
  1. context.lineWidth = 3;

  2. var fromX = 50;
  3. var fromY = 50;
  4. var toX   = 300;
  5. var toY   = 50;
  6. var cp1X   = 100;
  7. var cp1Y   = 100;
  8. var cp2X   = 250;
  9. var cp2Y   = 100;

  10. context.beginPath();
  11. context.moveTo(fromX, fromY);
  12. context.bezierCurveTo(cp1X, cp1Y, cp2X, cp2Y, toX, toY);
  13. context.stroke();
  14. context.closePath();      
復(fù)制代碼

  這段代碼從(50,50)繪制一條三次貝茲曲線到(300,50),兩個(gè)控制點(diǎn)分別為:(100,100)和(250,100)。得到的結(jié)果如下:

0.jpg

  曲線下方的兩個(gè)小圓點(diǎn)是兩個(gè)控制點(diǎn),他們并不是曲線的一部分。

  下面是一個(gè)不同的例子,它的開(kāi)始點(diǎn)和結(jié)束點(diǎn)于上面的例子相同,但是控制點(diǎn)和上面的例子不相同。
  1. context.lineWidth = 3;

  2. var fromX = 50;
  3. var fromY = 50;
  4. var toX   = 300;
  5. var toY   = 50;
  6. var cp1X   = 100;
  7. var cp1Y   = 10;
  8. var cp2X   = 250;
  9. var cp2Y   = 100;

  10. context.beginPath();
  11. context.moveTo(fromX, fromY);
  12. context.bezierCurveTo(cp1X, cp1Y, cp2X, cp2Y, toX, toY);
  13. context.stroke();
  14. context.closePath();      
復(fù)制代碼

  上面的代碼得到的結(jié)果如下:

11.jpg

  文章的最后,我們引用MDN上的一個(gè)例子,它用Canvas路徑繪制出“吃豆人”游戲的一個(gè)小場(chǎng)景:

12.jpg

  實(shí)現(xiàn)的代碼如下:
  1. function draw() {
  2.   var canvas = document.getElementById('canvas');
  3.   if (canvas.getContext){
  4.     var ctx = canvas.getContext('2d');

  5.     roundedRect(ctx,12,12,150,150,15);
  6.     roundedRect(ctx,19,19,150,150,9);
  7.     roundedRect(ctx,53,53,49,33,10);
  8.     roundedRect(ctx,53,119,49,16,6);
  9.     roundedRect(ctx,135,53,49,33,10);
  10.     roundedRect(ctx,135,119,25,49,10);

  11.     ctx.beginPath();
  12.     ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false);
  13.     ctx.lineTo(31,37);
  14.     ctx.fill();

  15.     for(var i=0;i<8;i++){
  16.       ctx.fillRect(51+i*16,35,4,4);
  17.     }

  18.     for(i=0;i<6;i++){
  19.       ctx.fillRect(115,51+i*16,4,4);
  20.     }

  21.     for(i=0;i<8;i++){
  22.       ctx.fillRect(51+i*16,99,4,4);
  23.     }

  24.     ctx.beginPath();
  25.     ctx.moveTo(83,116);
  26.     ctx.lineTo(83,102);
  27.     ctx.bezierCurveTo(83,94,89,88,97,88);
  28.     ctx.bezierCurveTo(105,88,111,94,111,102);
  29.     ctx.lineTo(111,116);
  30.     ctx.lineTo(106.333,111.333);
  31.     ctx.lineTo(101.666,116);
  32.     ctx.lineTo(97,111.333);
  33.     ctx.lineTo(92.333,116);
  34.     ctx.lineTo(87.666,111.333);
  35.     ctx.lineTo(83,116);
  36.     ctx.fill();

  37.     ctx.fillStyle = "white";
  38.     ctx.beginPath();
  39.     ctx.moveTo(91,96);
  40.     ctx.bezierCurveTo(88,96,87,99,87,101);
  41.     ctx.bezierCurveTo(87,103,88,106,91,106);
  42.     ctx.bezierCurveTo(94,106,95,103,95,101);
  43.     ctx.bezierCurveTo(95,99,94,96,91,96);
  44.     ctx.moveTo(103,96);
  45.     ctx.bezierCurveTo(100,96,99,99,99,101);
  46.     ctx.bezierCurveTo(99,103,100,106,103,106);
  47.     ctx.bezierCurveTo(106,106,107,103,107,101);
  48.     ctx.bezierCurveTo(107,99,106,96,103,96);
  49.     ctx.fill();

  50.     ctx.fillStyle = "black";
  51.     ctx.beginPath();
  52.     ctx.arc(101,102,2,0,Math.PI*2,true);
  53.     ctx.fill();

  54.     ctx.beginPath();
  55.     ctx.arc(89,102,2,0,Math.PI*2,true);
  56.     ctx.fill();
  57.   }
  58. }

  59. // A utility function to draw a rectangle with rounded corners.

  60. function roundedRect(ctx,x,y,width,height,radius){
  61.   ctx.beginPath();
  62.   ctx.moveTo(x,y+radius);
  63.   ctx.lineTo(x,y+height-radius);
  64.   ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
  65.   ctx.lineTo(x+width-radius,y+height);
  66.   ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
  67.   ctx.lineTo(x+width,y+radius);
  68.   ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
  69.   ctx.lineTo(x+radius,y);
  70.   ctx.quadraticCurveTo(x,y,x,y+radius);
  71.   ctx.stroke();
  72. }               
復(fù)制代碼

  本文版權(quán)屬于jQuery之家,轉(zhuǎn)載請(qǐng)注明出處:http://www.htmleaf.com/ziliaoku/ ... g/201507122217.html


【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了基于HTML5 Canvas的3D動(dòng)態(tài)Chart圖表的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
本篇文章主要介紹了HTML5 Canvas 實(shí)現(xiàn)圓形進(jìn)度條并顯示數(shù)字百分比效果示例,具有一定的參考價(jià)值,有興趣的可以了解一下
這篇文章主要介紹了HTML5 Canvas 旋轉(zhuǎn)風(fēng)車(chē)?yán)L制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了html5 canvas合成海報(bào)所遇問(wèn)題及解決方案總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
由于實(shí)際運(yùn)行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會(huì)達(dá)到,所以這部分不是開(kāi)發(fā)者能夠決定的,開(kāi)發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個(gè)自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對(duì)JavascriptAPI的擴(kuò)展。,HTML5中國(guó),中國(guó)最大的HTML5中文門(mén)戶。
主站蜘蛛池模板: 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 海南在线 海南一家 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 微信小程序定制,广州app公众号商城网站开发公司-广东锋火 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 上海佳武自动化科技有限公司| 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 |