濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 利用 Canvas實(shí)現(xiàn)繪畫(huà)一個(gè)未閉合的帶進(jìn)度條的圓環(huán)

利用 Canvas實(shí)現(xiàn)繪畫(huà)一個(gè)未閉合的帶進(jìn)度條的圓環(huán)

熱門(mén)標(biāo)簽:高德地圖標(biāo)注商戶(hù)怎么標(biāo) 黃石ai電銷(xiāo)機(jī)器人呼叫中心 ok電銷(xiāo)機(jī)器人 智能電銷(xiāo)機(jī)器人被禁用了么 惡搞電話(huà)機(jī)器人 電話(huà)機(jī)器人技術(shù) 地圖標(biāo)注軟件打印出來(lái) 欣鼎電銷(xiāo)機(jī)器人 效果 如何查看地圖標(biāo)注
最終效果圖

一、定義變量

定義半徑,定義圓環(huán)厚度,定義圓心位置、定義默認(rèn)填充顏色

let radius = 75
let thickness= 10
let innerRadius = radius - thickness
let x = 75
let y = 75
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "#f2d7d7";

二、畫(huà)第一個(gè)圓弧

ctx.beginPath();
ctx.arc(x, y, radius, Math.PI * 1.5, Math.PI)

注意 beginPath() 這個(gè)方法,生成路徑的第一步。本質(zhì)上,路徑是由很多子路徑構(gòu)成,這些子路徑都是在一個(gè)列表中,所有的子路徑(線(xiàn)、弧形、等等)構(gòu)成圖形。而每次這個(gè)方法調(diào)用之后,列表清空重置,然后我們就可以重新繪制新的圖形。
 

也就是說(shuō),這個(gè)方法可以用來(lái)給 Canvas圖像 分組,繪制新的圖形如果不調(diào)用此方法,那么新的圖形會(huì)和前面的圖形連接在一起

三、畫(huà)第一個(gè)連接處

ctx.quadraticCurveTo((x - innerRadius) - thickness / 2, y - thickness, x - innerRadius, y)

連接外是用二次貝塞爾曲線(xiàn)來(lái)畫(huà)的,Canvas的 quadraticCurveTo(cp1x, cp1y, x, y) 方法接受4個(gè)參數(shù),第一、二個(gè)參數(shù)為控制點(diǎn),第三、四個(gè)參數(shù)為結(jié)束點(diǎn)官方文檔
只需算出控制點(diǎn)和結(jié)束點(diǎn),就可以畫(huà)出一個(gè)圓弧

四、畫(huà)第二個(gè)圓弧

ctx.arc(x, y, innerRadius, Math.PI, Math.PI * 1.5, true)

注意方法后面最后一個(gè)參數(shù),設(shè)置為true,代表逆時(shí)針繪制(默認(rèn)是順時(shí)針)

五、畫(huà)第二個(gè)連接處

ctx.quadraticCurveTo(y - thickness, (x - innerRadius) - thickness / 2, x, y - innerRadius - thickness)

這一步其實(shí)和第三步相差不大,簡(jiǎn)單的調(diào)換了下參數(shù)位置

六、填充

 ctx.fill();

至此,一個(gè)簡(jiǎn)單的未閉合的圓環(huán)就完成了

畫(huà)第二個(gè)進(jìn)度條圓環(huán)

七、初始化

ctx.beginPath();
ctx.fillStyle = "#e87c7c";

beginPath 表示繪制新的圖形,如果不調(diào)用此方法,那后面畫(huà)的圖形會(huì)和前面畫(huà)的圖形連在一起

八、繪制第二個(gè)進(jìn)度條圓環(huán)

ctx.beginPath();
ctx.fillStyle = "#e87c7c";
ctx.arc(x, y, radius, Math.PI * 1.5, Math.PI * 2)
ctx.quadraticCurveTo((x + innerRadius) + thickness / 2, y + thickness, x + innerRadius, y)
ctx.arc(x, y, innerRadius, Math.PI * 2, Math.PI * 1.5, true)
ctx.quadraticCurveTo(y - thickness, (x - innerRadius) - thickness / 2, x, y - innerRadius - thickness)

ctx.fill();

由于和第一個(gè)圓環(huán)繪制方式一模一樣,就不在重復(fù)了,區(qū)別僅僅是圓的弧度

九、旋轉(zhuǎn) Canvas

transform: rotate(-135deg);

由于css的旋轉(zhuǎn)比較方便,也省去了角度的計(jì)算,所以本人使用的是css的transform來(lái)旋轉(zhuǎn)的。當(dāng)然 Canvas 也提供了旋轉(zhuǎn)的方法

完整代碼

 

<!DOCTYPE html>
<html lang="cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>canvas</title>
    <style>
        .ring {
            width: 150px;
            height: 150px;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-direction: column;
            position: relative;
        }

        #tutorial {
            transform: rotate(-135deg);
            width: 150px; 
            height: 150px;
        }

        .fraction {
            position: absolute;
            font-size: 30px;
            font-weight: bold;
            color: red;
        }

        .small {
            font-size: 12px;
            font-weight: lighter;
        }

        .title {
            color: red;
            bottom: 0;
            position: absolute;
        }
    </style>
</head>

<body>
    <div class="ring">
        <canvas id="tutorial" width="150" height="150"></canvas>
        <span class="fraction">100 <span class="small">分</span> </span>
        <span class="title">服務(wù)分</span>
    </div>

    <script>
        let radius = 75
        let thickness = 10
        let innerRadius = radius - thickness
        let x = 75
        let y = 75
        var canvas = document.getElementById('tutorial');
        var ctx = canvas.getContext('2d');
        ctx.fillStyle = "#f2d7d7";

        ctx.beginPath();
        ctx.arc(x, y, radius, Math.PI * 1.5, Math.PI)
        ctx.quadraticCurveTo((x - innerRadius) - thickness/2 , y - thickness, x - innerRadius, y)
        ctx.arc(x, y, innerRadius, Math.PI, Math.PI * 1.5, true)
        ctx.quadraticCurveTo(y - thickness, (x - innerRadius) - thickness / 2, x, y - innerRadius - thickness)
        ctx.fill();

        ctx.beginPath();
        ctx.fillStyle = "#e87c7c";
        ctx.arc(x, y, radius, Math.PI * 1.5, Math.PI * 2)
        ctx.quadraticCurveTo((x + innerRadius) + thickness / 2, y + thickness, x + innerRadius, y)
        ctx.arc(x, y, innerRadius, Math.PI * 2, Math.PI * 1.5, true)
        ctx.quadraticCurveTo(y - thickness, (x - innerRadius) - thickness / 2, x, y - innerRadius - thickness)
        ctx.fill();
    </script>
</body>

</html>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:綏化 中山 赤峰 萍鄉(xiāng) 聊城 盤(pán)錦 金昌 阿壩

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《利用 Canvas實(shí)現(xiàn)繪畫(huà)一個(gè)未閉合的帶進(jìn)度條的圓環(huán)》,本文關(guān)鍵詞  利用,Canvas,實(shí)現(xiàn),繪畫(huà),一個(gè),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《利用 Canvas實(shí)現(xiàn)繪畫(huà)一個(gè)未閉合的帶進(jìn)度條的圓環(huán)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于利用 Canvas實(shí)現(xiàn)繪畫(huà)一個(gè)未閉合的帶進(jìn)度條的圓環(huán)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    五指山市| 乐亭县| 利辛县| 金坛市| 慈利县| 乌拉特后旗| 衡水市| 汾西县| 文山县| 阿拉善盟| 徐闻县| 剑河县| 漳州市| 大同县| 改则县| 梓潼县| 东乡| 巫山县| 礼泉县| 连南| 林口县| 十堰市| 景宁| 木兰县| 依兰县| 武定县| 徐州市| 阜南县| 潜山县| 神农架林区| 敖汉旗| 峨眉山市| 三河市| 榆树市| 丰镇市| 穆棱市| 安新县| 巧家县| 宁波市| 桦甸市| 新密市|