1. 程式人生 > >[實驗]在同一個 canvas 元素中繪製不同顏色的圖形

[實驗]在同一個 canvas 元素中繪製不同顏色的圖形

實驗背景:

在做一個 HTML 5 的一個遊戲專案的時候,想在同一個 canvas 元素中繪製多個具有不同顏色的圖畫,但是由於當時對 HTML 5 canvas 元素不是很熟悉,結果總是所有圖畫都具有一樣的顏色。去網上查詢,也沒有找到這個問題的答案,於是只能自己研究了。

實驗說明:

該專案本是移動平臺的跨平臺專案,可以跑在WP7,WP8,Andriod,iOS,黑莓等平臺,但由於 HTML 5 本身具有較好的跨平臺性,所以在保證平臺相容性沒有問題的

情況下,本次測試在PC上進行。

實驗目的:

在同一個 canvas 元素中繪製多個不同顏色的圖畫

實驗材料:

語言:HTML5,javascript

開發工具:VS 2012 

測試工具:IE 10

實驗過程:

首先建立一個 HTML 5 的基本頁面,並新增一個 canvas 元素,id 為 myCanvas,然後新增 JS 程式碼,繪製四個小圓圈

程式碼如下:

<!DOCYTPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>在同一個 canvas 元素中繪製不同顏色的圖畫</title>
        <script>
            function start()
            {
                var c = document.getElementById("myCanvas")
                var cxt = c.getContext("2d")

                cxt.fillStyle = "#FF00FF"
                cxt.arc(100, 100, 50, 0, Math.PI * 2, true)
                cxt.fill() 

                cxt.fillStyle = "#FF0000"
                cxt.arc(200, 200, 50, 0, Math.PI * 2, true)
                cxt.fill()

                cxt.fillStyle = "#FFFF00"
                cxt.arc(300, 300, 50, 0, Math.PI * 2, true)
                cxt.fill()

                cxt.fillStyle = "#000000"
                cxt.arc(400, 400, 50, 0, Math.PI * 2, true)
                cxt.fill()
            }
        </script>
    </head>
    <body onload="start()">
        <canvas id="myCanvas" height="1000" width="1000">
            你的瀏覽器不支援 HTML 5
        </canvas>
    </body>
</html>

效果如圖:

程式碼說明:

本想為四個圓填充不同顏色,但最終結果是四個圓全部是黑色,即第四個圓的顏色,難道 一個 canvas 中只能有一種

fillStyle 嗎?如果只有一種顏色,豈不是太單一?於是我又進行了多次測試。

經過測試,最終找到了一個解決方案。

canvas 繪製可以通過 JS 程式碼來控制(其實應該說 HTML 5  只是提供了個容器,繪製只能在 JS 裡完成),而 JS 提

供了兩個函式,beginPath() 和 closePath() ,這兩

個函式可以起到類似 <div> 的作用,用它來把每個圓圈包圍,就可以繪製不同顏色的圖形了。

程式碼如下:

<!DOCYTPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>在同一個 canvas 元素中繪製不同顏色的圖畫</title>
        <script>
            function start()
            {
                var c = document.getElementById("myCanvas")
                var cxt = c.getContext("2d")

                cxt.beginPath() //注意此處
                cxt.fillStyle = "#FF00FF"
                cxt.arc(100, 100, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此處

                cxt.beginPath() //注意此處
                cxt.fillStyle = "#FF0000"
                cxt.arc(200, 200, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此處

                cxt.beginPath() //注意此處
                cxt.fillStyle = "#FFFF00"
                cxt.arc(300, 300, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此處

                cxt.beginPath() //注意此處
                cxt.fillStyle = "#000000"
                cxt.arc(400, 400, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此處
            }
        </script>
    </head>
    <body onload="start()">
        <canvas id="myCanvas" height="1000" width="1000">
            你的瀏覽器不支援 HTML 5
        </canvas>
    </body>
</html>

效果如圖:

請讀者們注意,兩個函式有所屬的物件,此事例中為 cxt 。

另外,在測試中,筆者還發現,當去掉所有的 closePath() 時,只保留 beginPath() ,一樣可以達到目的,也就是

說,當遇到beginPath() 時,會自動重新開始下一個圖形

的繪製(保留 closePath() ,去掉 beginPath() 時,效果相當於不新增這兩個函式)。但是筆者個人認為,最好兩個

函式都新增,這樣會提高程式碼可讀性,使程式碼更規

範。

實驗結果:

成功在同一個 canvas 元素中繪製出不同顏色的多個圖形,並且還對 beginPath() 和 closePath() 的用法有了意外收穫。

實驗總結:HMTL 5 的 canvas 是一大亮點,可以繪製出精美的圖形(本文只是對某種用法的討論,真正的 canvas

的功能要比此例強大的多),但對在實驗中意外收穫

的beginPath() 和closePath() 函式的用法,以及由此聯想出的 canvas 繪製圖形的機制,筆者還很不清楚,會在以後

找時間繼續研究。

最後,歡迎大家積極討論,糾正筆者的錯誤,提出寶貴意見,補充完善筆者的觀點,謝謝!

Rember!You make luck!

注:

本文為原創成果,轉載請註明出處,謝謝!

分享到:

相關推薦

[實驗]在同一個 canvas 元素繪製不同顏色圖形

實驗背景: 在做一個 HTML 5 的一個遊戲專案的時候,想在同一個 canvas 元素中繪製多個具有不同顏色的圖畫,但是由於當時對 HTML 5 canvas 元素不是很熟悉,結果總是所有圖畫都具有一樣的顏色。去網上查詢,也沒有找到這個問題的答案,於是只能自己研究了。

一個在h5的canvas元素畫撲克牌jquery插件實現

code isp arguments close tca func spa font blog 1 //非架構 2 ; (function ($) { 3 var aspect = 5.7 / 8.8;//撲克寬和高比例 4 function Paint

Matlab:繪製不同顏色的柱狀圖bar

1、當有多個圖片的時候需要用figure函式來分別顯示: figure(1) imshow(img_test); figure(2) bar(n,m) 2、對bar進行不同顏色的繪製: %bar顏色資料 color_set=[data1 data2 data3]

webgl第七課-滑鼠分象限繪製不同顏色的點

需要原始碼可以Q群:828202939 或者點選這裡  希望可以和大家一起學習、一起進步!!純手打!! 書籍是PDF電子檔,也在Q群裡,所有的課程原始碼在我上傳的資源裡面,本來想設定開源,好像不行! 如有錯別字或有理解不到位的地方,可以留言或者加微信15250969798,在下

#Qt入門#---------label顯示不同顏色的字元

因為除錯需要,現在要用不同顏色高亮,方便觀察資料。 具體方法是這樣的: label->setText(                                QObject::tr

UILabel設定多種字型、顏色(文字字型不同顏色

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String,try your best to test a

html5 canvas元素字型繪製

<!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">         <title></title>         <

如何在一個TextView顯示不同顏色的文字

在唯品會app中,我們可以看到它裡面有些文字控制元件能夠顯示不同顏色的文字,這種效果看起來蠻不錯的。先上個效果圖: 其實,在這上面使用的是一個TextView控制元件來顯示這段文字的。而文字內容是使用html的格式實現的,程式碼如下: text.setText(Html.

Matlab一個視窗繪製多個圖形

subplot指令 將影象視窗分成若干個區域,在每個區域內分別繪圖. handle = subplot(m, n, p); 上述指令將影象劃分為 m*n 個子區域, p用於指向子區域. 順序為 1 2 3 … n n+1 n+2 n+3 2n ……………………………………..

mysql統計同一個不同條件下的個數

方法 解決 select where 一個 mysq tro 嘗試 student 想要同時統計男生數量和不及格數量。SELECT COUNT(1) AS boyNum FROM t_student WHERE sex=‘男‘; SELECT COUNT(1) AS poo

C#在PDF如何以不同顏色高亮文本

.net c# pdf 文本高亮 高亮的文本有助於閱讀者快速有效地獲取文章關鍵信息。在PDF文件中,對文章的不同文本,關鍵詞、句等進行不同顏色的文本高亮操作,可以使閱讀者在閱讀過程中有效地區分不同高亮顏色文本的意義。在下面的示例中,我使用Free Spire.PDF for .NET來進行操作

android 通過不同的條件,改變listview字型顏色及背景色

結果圖: 通過介面卡進行操作: public class SystemAdapter extends BaseAdapter { private ArrayList<SjClass> sData; private Context sContext;

android實現一段文字不同顏色

相信大多程式設計師都會遇到UI給的效果圖中,一段文字,卻用不同的顏色顯示關鍵字以突出重點。我們平常用到都是使用TextView設定textColor就可以了,如何設定多種顏色呢,有兩種方法: 使用HTML 、strings.xml 輔助完成在strings.xml檔案中新增  #6a6

HTML5 Canvas繪製橢圓的幾種方法

1.canvas自帶的繪製橢圓的方法 ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)是後來新增的, 引數的意思:(起點x.起點y,半徑x,半徑y,旋轉的角度,起始角,結果角,順時針還是逆時針)

從一個數組抽取不同元素

public function j() { $user = array(1,1,2,1,1,1,1,1,9); $draw_user = []; $num = 3; for ($i=0; $i < $num; $i++) { $user_key = array_ran

canvas元素繪製太極圖

<!DOCTYPE html><html><head> <title>canvas example</title> <meta charset="utf-8"></head><body><canva

同一個元素繫結不同的事件指向同一個事件的處理函式

<input type="button" value="點選" id="btn"/><script src="commer.js"></script><script> //為同一個元素繫結不同的事件指向同一個事件的處理函式 ver("btn").on

Canvas繪製貝塞爾曲線

① 什麼是貝塞爾曲線?     在數學的數值分析領域中,貝濟埃曲線(英語:Bézier curve,亦作“貝塞爾”)是計算機圖形學中相當重要的引數曲線。更高維度的廣泛化貝濟埃曲線就稱作貝濟埃曲面,其中貝濟埃三角是一種特殊的例項。     貝濟埃曲線於1962年,由

android 使用TextView實現分段顯示不同顏色的字串

一、最容易想到的是使用多個TextView,設定其android:textColor="#000000" 二、使用HTML標籤 String content="我要顯示<font color='#FF0000'>紅色</font>"; TextVi

canvas繪製文字

canvas提供兩種文字渲染方式: fillText(text,x,y[,maxWidth]); // 在指定的(x,y)處填充文字,繪製的最大寬度是可選的 strokeText(text,x,y[,m