在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ Ch4 多線條組成圖形
Ch22 最后的API
Ch14 旋轉(zhuǎn)變換
Ch19 全局陰影與圖像合成
Ch12 三次貝塞爾曲線
Ch4 多線條組成圖形
Ch7 填充顏色
Ch6 線條的屬性
Ch20 裁剪和繪制圖像
CANVAS——Draw on the Web
Ch18 文本對齊與度量
Ch8 填充樣式
Ch15 縮放變換
Ch9 繪制標(biāo)準(zhǔn)圓弧
Ch2 開始前的準(zhǔn)備
Ch16 矩陣變換
Ch3 從線段開始
Ch10 使用切點繪制圓弧
Ch21 非零環(huán)繞原則
Ch11 二次貝塞爾曲線
Ch5 繪制矩形
Ch17 文本顯示與渲染
Ch1 HTML5簡介
Ch13 平移變換

Ch4 多線條組成圖形

繪制折線

上一節(jié)中,我們已經(jīng)成功繪制了一條線段。那么,如果我要繪制有兩個筆畫甚至是很多筆畫的折線怎么辦呢?

聰明的小伙伴肯定已經(jīng)想到了,這還不簡單,復(fù)用lineTo()就可以了。下面我就獻(xiàn)丑隨便畫了一條優(yōu)美的折線~

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>繪制折線</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧!!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.moveTo(100,100);
        context.lineTo(300,300);
        context.lineTo(100,500);
        context.lineWidth = 5;
        context.strokeStyle = "#AA394C";
        context.stroke();
    }
</script>
</body>
</html>

演示 4-1

運行結(jié)果:

繪制折線

繪制多條折線

那同理,我們要繪制多條樣式各不相同的折線怎么辦呢?比如我們在這里畫三條折線,分別是紅色、藍(lán)色、黑色。聰明的小伙伴肯定想到了,這還不簡單,只需要平移一下再改下畫筆顏色就行了。代碼格式都一樣的,復(fù)制就可以了。代碼如下。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>繪制折線</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧??!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.moveTo(100,100);
        context.lineTo(300,300);
        context.lineTo(100,500);
        context.lineWidth = 5;
        context.strokeStyle = "red";
        context.stroke();

        context.moveTo(300,100);
        context.lineTo(500,300);
        context.lineTo(300,500);
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.stroke();

        context.moveTo(500,100);
        context.lineTo(700,300);
        context.lineTo(500,500);
        context.lineWidth = 5;
        context.strokeStyle = "black";
        context.stroke();
    }
</script>
</body>
</html>

演示 4-2

運行結(jié)果:

繪制多條折線

咦?是不是很奇怪?說好的先紅色,再藍(lán)色,再黑色呢?怎么全是黑色了?其實,這里的原因是我之前一直強(qiáng)調(diào)的一點——Canvas是基于狀態(tài)的繪制。

什么意思呢?其實這段代碼每次使用stroke()時,它都會把之前設(shè)置的狀態(tài)再繪制一遍。第一次stroke()時,繪制一條紅色的折線;第二次stroke()時,會再重新繪制之前的那條紅色的折線,但是這個時候的畫筆已經(jīng)被更換成藍(lán)色的了,所以畫出的折線全是藍(lán)色的。換言之,strokeStyle屬性被覆蓋了。同理,第三次繪制的時候,畫筆顏色是最后的黑色,所以會重新繪制三條黑色的折線。所以,這里看到的三條折線,其實繪制了3次,一共繪制了6條折線。

那么,我想繪制三條折線,難道就沒有辦法了嗎?藝術(shù)家之魂到此為止了么?沒救了么?不,還有辦法。

使用beginPath()開始繪制

為了讓繪制方法不重復(fù)繪制,我們可以在每次繪制之前加上beginPath(),代表下次繪制的起始之處為beginPath()之后的代碼。我們在三次繪制之前分別加上context.beginPath()。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>繪制折線</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧??!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.beginPath();
        context.moveTo(100,100);
        context.lineTo(300,300);
        context.lineTo(100,500);
        context.lineWidth = 5;
        context.strokeStyle = "red";
        context.stroke();

        context.beginPath();
        context.moveTo(300,100);
        context.lineTo(500,300);
        context.lineTo(300,500);
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.stroke();

        context.beginPath();
        context.moveTo(500,100);
        context.lineTo(700,300);
        context.lineTo(500,500);
        context.lineWidth = 5;
        context.strokeStyle = "black";
        context.stroke();
    }
</script>
</body>
</html>

演示 4-3

運行結(jié)果:

使用beginPath()繪制多條折線

可以看到,這里得到了我們預(yù)想的結(jié)果。因為使用了beginPath(),所以這里的繪制過程如我們所想的那樣,只繪制了三次,而且每次只繪制一條折線。beginPath()是繪制設(shè)置狀態(tài)的起始點,它之后代碼設(shè)置的繪制狀態(tài)的作用域結(jié)束于繪制方法stroke()fill()或者closePath(),至于closePath()之后會講到。

所以我們每次開始繪制前都務(wù)必要使用beginPath(),為了代碼的完整性,建議大家在每次繪制結(jié)束后使用closePath()。大多數(shù)情況下不使用是沒有什么關(guān)系的,但是使用的話可以增強(qiáng)代碼的可讀性以及意想不到的效果。什么效果呢?下一節(jié)我會介紹。

劇透一下,下一節(jié)我們開始繪制矩形?。≡趺礃?,從上一節(jié)的“一畫”(線條),到這一節(jié)的“兩畫”(折線),以及下一節(jié)課的“四畫”(矩形),是不是很激動呢?讓我們向藝術(shù)家之路繼續(xù)前進(jìn)!