成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

canvas繪制圓形動畫圓角進度條

springDevBird / 920人閱讀

摘要:如果不想看步驟的可以直接看最后面有完整的代碼最近在做一個圓形的進度條,在網(wǎng)上看了一些例子有些地方不太理解,后來自己寫了個一個分享一下先上一個最終的效果首先畫一整個圓定義進度為定義總進度為定義圓的半徑為至此大圓畫完上面的代碼需要注意的是方法的

如果不想看步驟的可以直接看最后面有完整的代碼

最近在做一個圓形的進度條,在網(wǎng)上看了一些例子有些地方不太理解,后來自己寫了個一個分享一下

先上一個最終的效果

首先畫一整個圓
    const cvsWitdh = 220
    const cvsHeight = 220

    const progess = 50 // 定義進度為50
    const maxPro = 100  // 定義總進度為100
    const r = 100 // 定義圓的半徑為100
    this.cvs.width = cvsWitdh
    this.cvs.height = cvsHeight
    const ctx = this.cvs.getContext("2d")
    ctx.lineWidth = 10
    ctx.strokeStyle = "#15496B"
    ctx.arc(r + 10, r + 10, r, 0, 2 * Math.PI) 
    ctx.stroke() // 至此大圓畫完
上面的代碼需要注意的是  arc 方法的最后一側(cè)參數(shù)是弧度(2π)不是角度,畫圓的起點是表的3點的位置開始畫的不是12點位置
然后是畫一個進度的圓弧

畫圓弧度,主要是需要計算出起點的弧度終點的弧度

    ctx.beginPath()
    ctx.lineCap = "round"
    // 下面是漸變的代碼不需要的可以換成純色
    let grd = ctx.createLinearGradient(0, 0, 220, 220)
    grd.addColorStop(0, "red")
    grd.addColorStop(1, "blue")
    ctx.strokeStyle = grd
    const startRadian = progress >= maxPro ? 0 : Math.PI * 1.5
    const rate = progress / maxPro
    const endRadian = progress >= maxPro ? 2 * Math.PI : 2 * Math.PI * rate - Math.PI / 2
    ctx.arc(r + 10, r + 10, r, startRadian, endRadian)
    ctx.stroke()
上面的代碼中  ctx.lineCap = "round" 這個是設(shè)置最終繪制的線是帶圓角的
起點的弧度計算方式

const startRadian = progess >= maxPro ? 0 : Math.PI * 1.5

我們希望點的起點位置是鐘表12點鐘位置,整個圓的弧度是 2π==360° 推算得知12點鐘的位置是 1.5π==270°

終點的弧度計算方式
  const rate = progress / maxPro
  const endRadian = progress >= maxPro ? 2 * Math.PI : 2 * Math.PI * rate - Math.PI / 2

const rate = progress / maxProo 得值為進度占圓的比率
2π * rate 就是進度所需要的弧度
由于 arc 方法畫圓的起點是3點的方向而我們的起點是12點方向所以我們還需要減掉一個 Math.PI / 2最終就得出了我們上面的公式

由于當progress等于maxPro的時候算出來的終點等于我們的起點最終畫的就會有問題,所以我們在計算起點終點的時候做了判斷 progress >= maxPro 時畫整圓

當前效果

動畫實現(xiàn)
    let currentProgress = 1
const timer = setInterval(() => {
      if (currentProgress >= progress) {
        currentProgress = progress
        clearInterval(timer)
      }
      ctx.beginPath()
      ctx.lineCap = "round"
      // 下面是漸變的代碼不需要的可以換成純色
      let grd = ctx.createLinearGradient(0, 0, 220, 220)
      grd.addColorStop(0, "red")
      grd.addColorStop(1, "blue")
      ctx.strokeStyle = grd
      const startRadian = currentProgress >= maxPro ? 0 : Math.PI * 1.5
      const rate = currentProgress / maxPro
      const endRadian = currentProgress >= maxPro ? 2 * Math.PI : 2 * Math.PI * rate - Math.PI / 2
      ctx.arc(r + 10, r + 10, r, startRadian, endRadian)
      ctx.stroke()
      currentProgress++
    }, 10)

動畫的實現(xiàn)也非常的簡單,我們只需定義一個臨時的進度 currentProgress 通過定時器每次累加這個進度知道與progress相等停止計時,期間每次繪制

完整的代碼

我用react 寫的所以直接把react的整個代碼粘過來了,如果不需要的可以只拿繪圖的那一部分

import React from "react"

export default class Test extends React.Component {
  componentDidMount () {
    this.renderProgress(30)
  }

  renderProgress (progress) {
    const cvsWitdh = 220
    const cvsHeight = 220
    const maxPro = 100  // 定義總進度為100
    const r = 100 // 定義圓的半徑為100
    this.cvs.width = cvsWitdh
    this.cvs.height = cvsHeight
    const ctx = this.cvs.getContext("2d")
    ctx.lineWidth = 10
    ctx.strokeStyle = "#15496B"
    ctx.arc(r + 10, r + 10, r, 0, 2 * Math.PI) // 2 * Math.PI === 360 度 最后一個參數(shù)代表的是圓的弧度
    ctx.stroke() // 至此大圓畫完
    if (progress === 0) {
      return
    }
    let currentProgress = 1
    const timer = setInterval(() => {
      if (currentProgress >= progress) {
        currentProgress = progress
        clearInterval(timer)
      }
      ctx.beginPath()
      ctx.lineCap = "round"
      // 下面是漸變的代碼不需要的可以換成純色
      let grd = ctx.createLinearGradient(0, 0, 220, 220)
      grd.addColorStop(0, "red")
      grd.addColorStop(1, "blue")
      ctx.strokeStyle = grd
      const startRadian = currentProgress >= maxPro ? 0 : Math.PI * 1.5
      const rate = currentProgress / maxPro
      const endRadian = currentProgress >= maxPro ? 2 * Math.PI : 2 * Math.PI * rate - Math.PI / 2
      ctx.arc(r + 10, r + 10, r, startRadian, endRadian)
      ctx.stroke()
      currentProgress++
    }, 10)
  }

  render () {
    return (
      


{ this.cvs = ref }} />

) } }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104702.html

相關(guān)文章

  • View之Canvas,Paint,Matrix,RectF等介紹

    摘要:將當前狀態(tài)保存在堆棧,之后可以調(diào)用的平移旋轉(zhuǎn)錯切剪裁等操作?;謴蜑橹岸褩14娴臓顟B(tài),防止后對執(zhí)行的操作對后續(xù)的繪制有影響。 目錄介紹 1.Paint畫筆介紹 1.1 圖形繪制 1.2 文本繪制 2.Canvas畫布介紹 2.1 設(shè)置屬性 2.2 畫圖【重點】 2.3 Canvas對象的獲取方式 2.4 Canvas的作用 2.5 Canvas繪制圓和橢圓 2.6 Can...

    khs1994 評論0 收藏0
  • 射雞獅說圓形進度不是我要的效果

    摘要:一個沒什么特別的日子,你接到了一個沒什么特別的設(shè)計圖,準備寫個沒什么特別的活動頁,然后,看到了一個效果唔,射雞獅啊,你這個圓是不是沒畫好啊,缺了個角。唔,那個是不是可以畫畫作為一個熟練操作和的前端工程師,那就去看看有沒有提供什么讓我們的吧。 一個沒什么特別的日子,你接到了一個沒什么特別的設(shè)計圖,準備寫個沒什么特別的活動頁,然后,看到了一個效果:showImg(https://segme...

    gyl_coder 評論0 收藏0
  • 射雞獅說圓形進度不是我要的效果

    摘要:一個沒什么特別的日子,你接到了一個沒什么特別的設(shè)計圖,準備寫個沒什么特別的活動頁,然后,看到了一個效果唔,射雞獅啊,你這個圓是不是沒畫好啊,缺了個角。唔,那個是不是可以畫畫作為一個熟練操作和的前端工程師,那就去看看有沒有提供什么讓我們的吧。 一個沒什么特別的日子,你接到了一個沒什么特別的設(shè)計圖,準備寫個沒什么特別的活動頁,然后,看到了一個效果:showImg(https://segme...

    defcon 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<