移动端,cavans和svg绘制进度图

Posted 珞珞如石

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端,cavans和svg绘制进度图相关的知识,希望对你有一定的参考价值。

先看效果:

起初是用cavans绘制的 结果会模糊,倍数绘制再缩小也是模糊,最后换成了svg绘制:

cavans:

global.progressChart = 
    template: ` 
      <div class="process-chart-box">
        <canvas id="progressChart">当前浏览器不支持canvas</canvas>
        <img src="xxx/progress_icon.png" class="progress-icon" v-if="per>0" />
      </div>
      `,
    data() 
      return 
        isDark: false
      
    ,
    props: [\'per\'],
    methods: 
      handleCanvas() 
        const isDark = this.isDark
        const percent = Math.round(this.per) / 100
        let rem =
          (document.body.offsetWidth / 750) * 100 < 60
            ? (document.body.offsetWidth / 750) * 100
            : 60
        let labelW = Math.round(0.32 * rem)

        const box = document.querySelector(\'.process-chart-box\')
        if (!box) return
        const w = box.offsetWidth
        const ctx = document.getElementById(\'progressChart\').getContext(\'2d\')
        ctx.canvas.width = w + 1
        ctx.canvas.height = w + 1

        //外圆环
        ctx.beginPath()
        ctx.arc(w / 2, w / 2, w / 2, 0, 2 * Math.PI)
        //strokeStyle边框  fillStyle填充
        ctx.strokeStyle = isDark ? \'#262626\' : \'#fff\'
        ctx.fillStyle = isDark ? \'#283851\' : \'#d6e6ff\'
        ctx.fill()
        ctx.stroke()
        //内圆环
        ctx.beginPath()
        ctx.arc(w / 2, w / 2, w / 2 - labelW, 0, 2 * Math.PI)
        ctx.strokeStyle = isDark ? \'#262626\' : \'#fff\'
        ctx.fillStyle = isDark ? \'#262626\' : \'#fff\'
        ctx.fill()
        ctx.stroke()
        //环形图的进度条
        if (percent > 0) 
          ctx.beginPath()
          ctx.arc(
            w / 2,
            w / 2,
            (w - labelW) / 2,
            -Math.PI / 2,
            -Math.PI / 2 + percent * (Math.PI * 2),
            false
          )
          ctx.lineWidth = labelW
          ctx.lineCap = \'round\'
          ctx.strokeStyle = isDark ? \'#2f71de\' : \'#3480ff\'
          ctx.stroke()
        
      
    ,
    mounted() 
      this.$nextTick(() => 
        this.getDisplayMode()
          .then(res => 
            this.isDark = !!res
            this.handleCanvas()
          )
          .catch(() => 
            this.handleCanvas()
          )
        window.addEventListener(
          \'resize\',
          () => 
            this.handleCanvas()
          ,
          false
        )
      )
    ,
    watch: 
      per() 
        this.handleCanvas()
      
    
  

svg:

  global.progressChart = 
    template: ` 
      <div class="process-chart-box">
        <svg : : version="1.1" xmlns="http://www.w3.org/2000/svg">
          <circle  class="progress-bg" :cx="w/2" :cy="w/2" :r="r" :stroke="isDark ? \'#283851\' : \'#d6e6ff\'" :stroke- fill="none"/>
          <circle : class="progress" :transform="rotate" :cx="w/2" :cy="w/2" :r="r" :stroke="isDark ? \'#2f71de\' : \'#3480ff\'" :stroke- fill="none" stroke-linecap="round" />
        </svg>
        <img src="xxx/progress_icon.png" class="progress-icon" v-if="per>0" />
      </div>
      `,
    data() 
      return 
        isDark: false
      
    ,
    props: [\'per\'],
    computed: 
      remToPx() 
        let rem =
          (document.body.offsetWidth / 750) * 100 < 60 ?
          (document.body.offsetWidth / 750) * 100 :
          60
        console.log(\'remToPx\', rem);
        return rem
      ,

      // 容器宽度
      w() 
        return 2.2 * this.remToPx
      ,
      // 进度宽度
      progressW() 
        return 0.28 * this.remToPx
      ,
      // 绘制半径
      r() 
        return (this.w - this.progressW) / 2
      ,
      // 进度旋转
      rotate() 
        return `rotate(-90,$this.w/2,$this.w/2)`
      
    ,
    methods: 
      handleSvg() 
        //换成svg绘制
        var progressDom = document.querySelector(".progress");
        if (!progressDom) 
          return
        
        let persent = this.per
        if (persent > 0) 
          var circleLength = Math.floor(2 * Math.PI * parseFloat(progressDom.getAttribute("r")));
          var value = persent * circleLength / 100;
          progressDom.setAttribute("stroke-dasharray", value + ",10000");
        

      ,
    ,
    mounted() 
      this.$nextTick(() => 
        this.getDisplayMode()
          .then(res => 
            this.isDark = !!res
            this.handleSvg()
          )
          .catch(() => 
            this.handleSvg()
          )
      )
    ,
    watch: 
      per() 
        this.handleSvg()
      
    
  

项目进度

上周我们小组分配了几个任务,分别为:
一、手工绘制出页面首页标题栏的其余页面部分框架;
二、根据首页页面编写注册后台程序设计;
三、根据首页页面编写登录后台程序;
四、 按照所绘制的“资料查询”和“优秀社团”页面图做出页面HTML页面;
五、按照所绘制的“热门活动”和“申请社团”页面图做出页面HTML页面;
六、按照所绘制的“校园风采”页面图做出页面HTML页面;
七、按照所绘制的“社团快讯”页面图做出页面HTML页面。
在这周里,小组的同学各自独立完成了个人任务,其中有一个页面未能按时完成,我们会尽快完成。
下一次的任务又来临了,我们会积极投入,完成项目!

以上是关于移动端,cavans和svg绘制进度图的主要内容,如果未能解决你的问题,请参考以下文章

基于Echarts4.0实现旭日图

react native 可以用svg 吗

基于Echarts4.0实现旭日图

如何绘制项目进度计划甘特图

js 多张图片加载 环形进度条

SVG的动态之美-搜狗地铁图重构散记