欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

HTML5邊玩邊學(xué)(2)基礎(chǔ)繪圖實(shí)現(xiàn)方法

  發(fā)布時(shí)間:2010-09-21 20:12:23   作者:佚名   我要評(píng)論
在前一篇博客中,我們測(cè)試了 canvas 標(biāo)簽的用法,并得到了 canvas 標(biāo)簽的渲染上下文對(duì)象, 但是并沒(méi)有用它繪制任何圖形。在這一篇中,我們先了解一下HTML5繪圖的一些基礎(chǔ)概念,然后再來(lái)畫(huà)幾個(gè)圖形玩玩。

一、坐標(biāo)系

其實(shí)只要玩過(guò)一點(diǎn)點(diǎn)圖形編程的人都知道,電腦上的坐標(biāo)系和數(shù)學(xué)上的坐標(biāo)系稍微有點(diǎn)不同,坐標(biāo)的原點(diǎn)在繪制區(qū)域(這里是Canvas)的左上角,X軸正向朝右,Y軸正向朝下,如下圖

聲明:為本文為原創(chuàng)文章,作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者左洸和出處博客園

 

二、Stroke 和 Fill

HTML5中將圖形分為兩大類:

第一類稱作 Stroke,我的理解就是輪廓、勾勒或者線條,總之,圖形是由線條組成的;

第二類稱作 Fill,就是填充區(qū)域

上下文對(duì)象中有兩個(gè)繪制矩形的方法,可以讓我們很好的理解這兩大類圖形的區(qū)別:

一個(gè)是 strokeRect,還有一個(gè)是 fillRect

下面的代碼分別用這兩個(gè)方法來(lái)繪制矩形,你可以分別點(diǎn)擊兩個(gè)按鈕來(lái)看看有什么不同,從而理解 stroke 和 fill 的區(qū)別
設(shè)置畫(huà)布

復(fù)制代碼
代碼如下:

<canvas id="test1" width="200" height="200" style=" background-color: grey">你的瀏覽器不支持 &lt;canvas&gt;標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器</canvas>
<input type="button" value="strokeRect" onclick="strokeRect();"/>
<input type="button" value="fillRect" onclick="fillRect();"/>


strokeRect 和 fillRect

復(fù)制代碼
代碼如下:

function strokeRect(){
var canvas = document.getElementById('test1');
var ctx=canvas.getContext("2d");
ctx.clearRect(0,0,200,200);
ctx.strokeStyle="blue";
ctx.strokeRect(10,10,180,180);
}
function fillRect(){
var canvas = document.getElementById('test1');
var ctx=canvas.getContext("2d");
ctx.clearRect(0,0,200,200);
ctx.fillStyle="blue";
ctx.fillRect(10,10,180,180);
}
 

你的瀏覽器不支持 <canvas>標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器

 

三、顏色

上下文對(duì)象有兩個(gè)屬性可以用來(lái)設(shè)置顏色:strokeStyle 和 fillStyle

strokeStyle 的值決定了你當(dāng)前要繪制的線條的顏色

fillStyle 的值決定了你當(dāng)前要填充的區(qū)域的顏色

顏色值應(yīng)該是符合CSS3 顏色值標(biāo)準(zhǔn)的有效字符串。下面的例子都表示同一種顏色。

//這些 fillStyle 的值均為 '橙色',ctx 是上下文對(duì)象 
ctx.fillStyle = "orange"
ctx
.fillStyle = "#FFA500";
ctx
.fillStyle = "rgb(255,165,0)"
ctx
.fillStyle = "rgba(255,165,0,1)";

關(guān)于顏色,以后會(huì)有更多的說(shuō)明。

 

四、基本繪圖

除了上面給出的兩個(gè)繪制矩形的方法外,上下文對(duì)象還有幾個(gè)方法可以用來(lái)繪制一些基本圖形,如下:

moveTo(x,y):moveTo方法并不能畫(huà)出任何東西,它只是將畫(huà)筆的當(dāng)前點(diǎn)移動(dòng)到(x,y)處

lineTo(x,y):從當(dāng)前點(diǎn)到(x,y)點(diǎn)繪制一條直線。注意:繪制完成后,當(dāng)前點(diǎn)就變成了(x,y),除非你用 moveTo 方法去改變他

arc(x, y, radius, startAngle, endAngle, anticlockwise) :繪制一條弧線

quadraticCurveTo(cp1x, cp1y, x, y)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) :這兩個(gè)方法都是繪制貝葉斯曲線,具體用法看參考手冊(cè)

rect(x, y, width, height) :繪制一個(gè)矩形。注意: 當(dāng)它被調(diào)用時(shí),moveTo 方法會(huì)自動(dòng)被調(diào)用,參數(shù)為(0,0),于是起始坐標(biāo)又恢復(fù)成初始原點(diǎn)了。

有了直線、弧線、曲線、方形和圓形這幾種基本圖形,我們就可以組合出更復(fù)雜的圖形了

 

五、理解繪制路徑 Drawing Path

上一篇文章中說(shuō)過(guò),我們繪制的圖形是先繪制到一個(gè)抽象的上下文對(duì)象中(其實(shí)就是內(nèi)存中),然后再將上下文對(duì)象輸出到顯示設(shè)備上,這個(gè)輸出到顯示設(shè)備的過(guò)程不需要我們操心。但是有時(shí)候我們并不想立刻輸出每一次繪制動(dòng)作,也許我想讓一組繪制動(dòng)作完成以后,再集中一塊輸出, 比如一個(gè)圍棋棋盤有19×19條直線組成,正常情況下需要向想顯示設(shè)備輸出19×19次,但是如果我們先暫停向顯示設(shè)備輸出,等在上下文中(內(nèi)存中)全部繪制完成19×19條直線時(shí),再向顯示設(shè)備輸出,只需要輸出一次就可以了。

這種情況在HTML5中叫做繪制路徑,它由幾個(gè)上下文對(duì)象的方法組成:

beginPath() :開(kāi)始路徑,意思就是在你調(diào)用這個(gè)方法后,你繪制的圖形就不會(huì)再向屏幕輸出了,而只是畫(huà)到了上下文對(duì)象中(內(nèi)存中)

stroke() :將你調(diào)用 beginPath 方法以后繪制的所有線條,一次性輸出到顯示設(shè)備上

closePath() :如果你調(diào)用 beginPath 方法以后,在上下文對(duì)象中進(jìn)行了一系列的繪制,但是得到的圖形是不閉合的,這個(gè)方法將會(huì)幫你補(bǔ)上最后一條直線,將你的圖形閉合起來(lái)。

注意closePath并不向屏幕輸出圖形,而只是在上下文對(duì)象中補(bǔ)上一條線,這個(gè)步驟不是必需的

fill() :

如果你的繪制路徑組成的圖形是封閉的,這個(gè)方法將用 fillStyle 設(shè)置的顏色填充圖形,然后立即向屏幕輸出;

如果繪制路徑不是封閉的,這個(gè)方法會(huì)先將圖形閉合起來(lái),然后再填充輸出。

注意:所有的 fill 圖形,如 fillRect 等,都是立刻向屏幕輸出的,他們沒(méi)有繪制路徑這個(gè)概念

 

下面的代碼將繪制一個(gè)簡(jiǎn)單的填充三角形。

注意:繪制三角形的時(shí)候,默認(rèn)的背景色為白色,默認(rèn)的前景色為黑色
設(shè)置畫(huà)布

復(fù)制代碼
代碼如下:

<canvas id="test2" width="200" height="200" style="border:1px solid #c3c3c3;">你的瀏覽器不支持 &lt;canvas&gt;標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器</canvas>
<input type="button" value="畫(huà)三角" onclick="drawTri();"/>
<input type="button" value="清除" onclick="clearTri();"/>



繪制三角形

復(fù)制代碼
代碼如下:

<script type="text/javascript">
function drawTri(){
var canvas = document.getElementById('test2');
var ctx=canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(75,50);
ctx.lineTo(100,75);
ctx.lineTo(100,25);
ctx.fill();
}
function clearTri(){
var canvas = document.getElementById('test2');
var ctx=canvas.getContext("2d");
ctx.clearRect(0,0,200,200);
}
</script>

你的瀏覽器不支持 <canvas>標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器

你的瀏覽器不支持 <canvas>標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器

 

六、半個(gè)單位的坐標(biāo)

里還要回過(guò)頭來(lái)說(shuō)說(shuō)坐標(biāo),下面的代碼是在畫(huà)布上繪制網(wǎng)格,點(diǎn)擊“畫(huà)網(wǎng)格”按鈕可以看見(jiàn)效果
設(shè)置畫(huà)布

復(fù)制代碼
代碼如下:

<canvas id="test2" width="200" height="200" style="border:1px solid #c3c3c3;">你的瀏覽器不支持 &lt;canvas&gt;標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器</canvas>
<input type="button" value="畫(huà)三角" onclick="drawTri();"/>
<input type="button" value="清除" onclick="clearTri();"/>



繪制三角形

復(fù)制代碼
代碼如下:

<script type="text/javascript">
function drawTri(){
var canvas = document.getElementById('test2');
var ctx=canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(75,50);
ctx.lineTo(100,75);
ctx.lineTo(100,25);
ctx.fill();
}
function clearTri(){
var canvas = document.getElementById('test2');
var ctx=canvas.getContext("2d");
ctx.clearRect(0,0,200,200);
}
</script>

你的瀏覽器不支持 <canvas>標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器

你的瀏覽器不支持 <canvas>標(biāo)簽,請(qǐng)使用 Chrome 瀏覽器 或者 FireFox 瀏覽器

 

這段代碼中,有一處奇怪的地方,就是坐標(biāo)循環(huán)是從0.5開(kāi)始的,這是為什么呢?

如下圖,假如我想繪制一條從(1,0)到(1,3)的線,由于線的默認(rèn)寬度是一個(gè)像素,所以在我想象中應(yīng)該繪制成深綠色的部分,即在坐標(biāo) 1 兩邊各占半個(gè)像素的寬度。

然而,瀏覽器的最小單位是一個(gè)像素,所以他會(huì)向兩邊擴(kuò)展,實(shí)際繪制出來(lái)的淺綠色的部分,即占用了兩個(gè)像素的寬度。這樣,我們繪制的線條在坐標(biāo)上就不精確了

如下圖,如果我們給出的起始坐標(biāo)是(1.5,0)和(1.5,3),那么線條的寬度才是正確的一個(gè)像素。

 

 

七、清空畫(huà)布

上面給出的兩段代碼中,我們都用到了清空畫(huà)布,用到的方法如下:

clearRect(x,y,width,height):

它接受四個(gè)參數(shù), x 和 y 指定矩形左上角(相對(duì)于原點(diǎn))的位置,width 和 height 是矩形的寬和高。調(diào)用該方法會(huì)將給出的矩形區(qū)域中所有繪制圖形都清空,露出畫(huà)布的背景

相關(guān)文章

  • HTML5中的Microdata與歷史記錄管理詳解

    Microdata作為HTML5新增的一個(gè)特性,它允許開(kāi)發(fā)者在HTML文檔中添加更多的語(yǔ)義信息,以便于搜索引擎和瀏覽器更好地理解頁(yè)面內(nèi)容,本文將探討HTML5中Microdata的使用方法以及
    2025-04-21
  • HTML5表格語(yǔ)法格式詳解

    在HTML語(yǔ)法中,表格主要通過(guò)< table >、< tr >和< td >3個(gè)標(biāo)簽構(gòu)成,本文通過(guò)實(shí)例代碼講解HTML5表格語(yǔ)法格式,感興趣的朋友一起看看吧
    2025-04-21
  • html5的響應(yīng)式布局的方法示例詳解

    這篇文章主要介紹了HTML5中使用媒體查詢和Flexbox進(jìn)行響應(yīng)式布局的方法,簡(jiǎn)要介紹了CSS Grid布局的基礎(chǔ)知識(shí)和如何實(shí)現(xiàn)自動(dòng)換行的網(wǎng)格布局,感興趣的朋友一起看看吧
    2025-04-21
  • 基于Canvas的Html5多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘實(shí)戰(zhàn)代碼

    本文介紹了如何使用Canvas在HTML5上實(shí)現(xiàn)一個(gè)多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘的web展示,通過(guò)Canvas的API,可以繪制出6個(gè)不同城市的時(shí)鐘,并且這些時(shí)鐘可以動(dòng)態(tài)轉(zhuǎn)動(dòng),每個(gè)時(shí)鐘上都會(huì)標(biāo)注出對(duì)應(yīng)的
    2025-03-11
  • HTML5 data-*自定義數(shù)據(jù)屬性的示例代碼

    HTML5的自定義數(shù)據(jù)屬性(data-*)提供了一種標(biāo)準(zhǔn)化的方法在HTML元素上存儲(chǔ)額外信息,可以通過(guò)JavaScript訪問(wèn)、修改和在CSS中使用,文章還介紹了高級(jí)用法,如存儲(chǔ)JSON數(shù)據(jù)、事
    2025-03-11
  • HTML5中下拉框<select>標(biāo)簽的屬性和樣式詳解

    在HTML5中,下拉框(<select>標(biāo)簽)作為表單的重要組成部分,為用戶提供了一個(gè)從預(yù)定義選項(xiàng)中選擇值的方式,本文將深入探討<select>標(biāo)簽的屬性、樣式,并重點(diǎn)介
    2025-02-27
  • HTML5 Input 日期選擇器詳解

    本文介紹了HTML5InputDatePicker對(duì)象表示HTML``元素,是HTML5中的新對(duì)象,介紹了日期、周、月份、時(shí)間、日期+時(shí)間、本地日期時(shí)間等不同類型的日期選擇器,感興趣的朋友一起看
    2025-02-17
  • HTML5超鏈接和圖片基礎(chǔ)用法詳解

    本文介紹了HTML5中的超鏈接、相對(duì)路徑和圖片的使用方法,超鏈接可以創(chuàng)建指向另一個(gè)文檔或頁(yè)面內(nèi)部書(shū)簽的鏈接,相對(duì)路徑用于在同一服務(wù)器內(nèi)部跳轉(zhuǎn)頁(yè)面,圖片標(biāo)簽用于引入外部圖
    2025-02-17
  • HTML5超鏈接的創(chuàng)建方法

    本文介紹了HTML5超鏈接的創(chuàng)建方法,包括基本語(yǔ)法、創(chuàng)建圖像超鏈接的邊框去除方法以及錨點(diǎn)鏈接的使用,還討論了超鏈接的四種不同狀態(tài)(link、visited、hover、active)的CSS樣
    2025-02-17
  • HTML5使用details標(biāo)簽:展開(kāi)/收縮信息

    最近看一些技術(shù)網(wǎng)站發(fā)現(xiàn)了details 標(biāo)簽的妙用,這個(gè)不用js即可實(shí)現(xiàn)展開(kāi)/收縮信息,很方便用來(lái)讓用戶先才答案,然后下面點(diǎn)擊再給出答案的效果,這里就為大家簡(jiǎn)單介紹一下,
    2024-11-03

最新評(píng)論