当前位置: 首页 > article >正文

小程序canvas画环形百分比进度图

在这里插入图片描述

组件封装

component/canvas-ring目录下

canvas-ring.js

<canvas style="width:{{canvasWidth}}px;height:{{canvasWidth}}px; margin:0 auto;position:relative" type="2d" id="myCanvas">
  <view class="circle-bar" style="height:{{canvasWidth}}px;">

    <view class="title_val" style="color: {{valueColor}}; font-weight:{{f_weight}}; margin-top:{{show_tip?'10':'0'}}rpx;font-size:{{f_size}}px">
      {{value}}
      <p style="font-size: 10px;display: inline;">
        {{suffix}}
      </p>
    </view>
    <view class="title_name" style="color: {{lineColor}};">
      {{title}}
    </view>
  </view>
</canvas>
canvas-ring.json
{
  "component": true,
  "usingComponents": {} 
 }
canvas-ring.wxss
.circle-bar{
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  position: absolute;
  top: 0;
}
.circle-bar .title_name{
  max-height: 62rpx;
  font-size: 26rpx;
  overflow:hidden;
  text-overflow:ellipsis;
  display:-webkit-box;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:2;
}
.circle-bar .title_val{
  color: #333333;
}
canvas-ring.js
var windWidth = wx.getSystemInfoSync().windowWidth; //这里获取下设备的屏幕宽度

Component({

  /**
   * 组件的属性列表
   */

  properties: {
    //画布的宽度 默认占屏幕宽度的0.4倍
    canvasWidth: {
      type: Number,
      value: windWidth * 0.4
    },
    //线条宽度 默认10
    lineWidth: {
      type: Number,
      value: 10
    },
    //线条颜色
    lineColor: {
      type: String,
      value: "#3696FA"
    },
    //标题 默认“完成率”
    title: {
      type: String,
      value: "完成率"
    },
    //当前的值 默认45
    value: {
      type: Number,
      value: 50
    },
    //值的颜色 默认””
    valueColor: {
      type: String,
      value: "#333"
    },
    //值的字体的大小颜色 默认
    f_size: {
      type: Number,
      value: 14
    },
    f_weight: {
      type: String,
      value: "500"
    },
    //最大值 默认100
    maxValue: {
      type: Number,
      value: 100
    },
    //最小值 默认0
    minValue: {
      type: Number,
      value: 0
    },
    //当前值的后缀名
    suffix: {
      type: null,
      value: "%"
    },
    //从什么角度开始 0~360之间 (12点方向为0,18点方向为180,0点方向为360)
    startDegree: {
      type: Number,
      value: 0
    }
  },
  data: {
    canvasWidth: windWidth * 0.4, //默认创建的环形图宽度为屏幕宽度的40%
    show_tip: true
  },
  methods: {
    drawCanvasRing() {

      //没标题的时候去掉margin-top的值
      if (this.data.title.replace(/(^\s*)|(\s*$)/g, "").length == 0) {
        this.setData({
          show_tip: false
        })
      }
      //canvas 2d
      const query = wx.createSelectorQuery().in(this);
      query.select("#myCanvas")
        .fields({
          node: true,
          size: true
        })
        .exec(this.init.bind(this))
    },
    init(res) {
      const canvas = res[0].node
      const ctx = canvas.getContext("2d");
      canvas.requestAnimationFrame(() => {})
      const dpr = wx.getSystemInfoSync().pixelRatio
      canvas.width = res[0].width * dpr
      canvas.height = res[0].height * dpr
      ctx.scale(dpr, dpr);
      // 大小值的计算
      var circle_r = this.data.canvasWidth / 2; //画布的一半,用来找中心点和半径
      var startDegree = this.data.startDegree; //从什么角度开始
      var maxValue = this.data.maxValue; //最大值
      var minValue = this.data.minValue; //最小值
      var value = this.data.value; //当前的值
      var lineColor = this.data.lineColor; //线条颜色
      var lineWidth = this.data.lineWidth; //线条宽度
      var percent = 360 * ((value - minValue) / (maxValue - minValue)); //计算结果
      //定义起始点
      ctx.translate(circle_r, circle_r);
      //灰色圆弧
      ctx.beginPath();
      ctx.strokeStyle = "#ebebeb";
      ctx.lineWidth = lineWidth;
      ctx.arc(0, 0, circle_r - 10, 0, 2 * Math.PI, true);
      ctx.stroke();
      ctx.closePath();
      //有色彩的圆弧
      ctx.beginPath();
      ctx.strokeStyle = lineColor;
      ctx.lineWidth = lineWidth;
      ctx.arc(0, 0, circle_r - 10, startDegree * Math.PI / 180 - 0.5 * Math.PI, percent * Math.PI / 180 + startDegree * Math.PI / 180 - 0.5 * Math.PI, false);
      ctx.stroke();
      ctx.closePath();
      console.log(this.data.value);
    }
  }
})

使用

父页面

canvas.js
  /**
   * 页面的初始数据
   */
  data: {
    completePercent: 10, //圆环A的动态值
    completePercent2: 60 //圆环B的动态值
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: async function (options) {
    await tools.request('/main/mainTest', {
      id: 1,
    }, 'get').then((res) => {
      if (res.data.code == 1) {
        this.setData({
          completePercent: res.data.data.score.before,
          completePercent2: res.data.data.score.finish,
        })
      } else {
        wx.showToast({
          title: res.data.msg,
          icon: 'none',
        })
      }
    })

await    this.getRingsA();
await    this.getRingsB();
  },

方法

  getRingsA() {
    this.canvasRing = this.selectComponent("#canringA");
    this.canvasRing.drawCanvasRing() //绘制圆环A
  },
  getRingsB() {
    this.canvasRing2 = this.selectComponent("#canringB");
    this.canvasRing2.drawCanvasRing() //绘制圆环B
  },
canvas.wxml
 <canvas2d-ring type="2d" id="canringA" canvasWidth="{{120}}" f_weight="bold" value="{{completePercent}}" lineColor="#EA0000" f_size="21" lineWidth="{{10}}" title="{{'施工前'}}"></canvas2d-ring>
canvas.json
{  
  "navigationStyle":"custom",
  "component": true,
  "usingComponents": {
    "canvas2d-ring": "/component/canvas-ring/canvas-ring"
  }
}

http://www.kler.cn/a/453088.html

相关文章:

  • elasticsearch中使用fuzzy查询
  • C++软件设计模式之装饰器模式
  • 【VScode】第三方GPT编程工具-CodeMoss安装教程
  • Java抽象工厂+单例模式
  • EdgeX Core Service 核心服务之 Core Command 命令
  • 【ES6复习笔记】函数参数的默认值(6)
  • uni-app:监听页面返回,禁用返回操作
  • 【数据库初阶】数据库基础知识
  • 无人零售及开源 AI 智能名片 S2B2C 商城小程序的深度剖析
  • 怎么学习数据结构与算法?
  • 【前端实现pdf导出】
  • GESP202309 二级【小杨的 X 字矩阵】题解(AC)
  • 【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
  • Android使用辅助服务AccessibilityService实现自动化任务
  • 力扣11. 盛最多水的容器
  • 【Pytorch实用教程】PyTorch 自带的数据集全面解读
  • 消息队列(一)消息队列的工作流程
  • 地理数据库Telepg面试内容整理-基础技术栈
  • 重温设计模式----装饰模式
  • SSE(Server-Sent Events)返回n ,前端接收数据时被错误的截断【如何避免SSE消息中的换行符或回车符被解释为事件消息的结束】
  • Halcon 的标定
  • 如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
  • hhdb客户端介绍(54)
  • 数据结构基本认识与必要知识点准备工作
  • 大型语言模型(LLMs)演化树 Large Language Models
  • Wux weapp 组件库的 bug—— wux-picker选择器组件无法正确初始化到选定的value