当前位置:   article > 正文

uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条_uniapp 环形进度条

uniapp 环形进度条

经常开发中,会遇到各种各样图表,这时大家普遍会想到去找插件。uniapp中常用的有uchart.js和echart.js,这对图表要求不高的项目来说,是很便捷的。但有时会遇到一些定制图表,加上UI的美化,这时就很难达到设计稿上的效果和客户要求了,在修改过程中也会消耗掉大量精力。俗话说:爹有娘有不如自己有,这种情况还不如通过canvas直接去实现,反而效率会快很多。这里先简单介绍实现一个“圆环带进度”的小案例,希望对大家有帮助。

一、uni-app中创建图表页面

1.1 vue页面

  1. <template>
  2. <view class="wrap-box">
  3. <view class="echart-box chart01">
  4. <view class="title">图表:圆环带进度条</view>
  5. <view class="content">
  6. <canvas canvas-id="chartBox1" id="chartBox1" class="chart"></canvas>
  7. <view class="btn-box">
  8. <button type="default" class="btn">减小</button>
  9. <button type="default" class="btn">增加</button>
  10. </view>
  11. </view>
  12. </view>
  13. </view>
  14. </template>
  15. <script>
  16. export default {
  17. data() {
  18. return {}
  19. },
  20. mounted() {},
  21. methods: {}
  22. }
  23. </script>
  24. <style lang="scss">
  25. @import './index.scss';
  26. </style>

1.2 scss样式文件

  1. .wrap-box{ padding: 0 30rpx;
  2. .echart-box{ padding: 15px 0; border-bottom: 1px solid #DDDDDD;
  3. .title{ font-size: 32rpx; }
  4. .content{ padding-top: 15rpx;
  5. .chart{ width: 300rpx; height: 300rpx; margin: 0 auto; }
  6. }
  7. .btn-box{ text-align: center;
  8. .btn{ display: inline-block; vertical-align: middle; margin: 0 20rpx; font-size: 30rpx; background-color: #297DFE; color: #fff; }
  9. }
  10. }
  11. }

1.3 创建chart.js文件

  1. /**
  2. * 图表 - 圆环带进度条
  3. */
  4. export class CircleBox {
  5. constructor(){}
  6. }

以上文件准备完成后,界面样式如下:

                    上图为现在样式

                 上图为实现后的样式。

二、实现chart图表绘制

2.1 chart.js中定义变量

        在CircleBox类的构造函数中,初始化必须的变量,代码如下:

  1. /**
  2. * 构造函数
  3. * @param {Object} _context
  4. */
  5. constructor(_context){
  6. this.ctx = _context;
  7. //直径
  8. this.radius = uni.upx2px(300);
  9. //四周内填充
  10. this.padding = uni.upx2px(20);
  11. //圆环宽度
  12. this.lineWidth = uni.upx2px(20);
  13. //圆环颜色
  14. this.lineColor = '#297DFE';
  15. //当前百分比
  16. this.percent = 0;
  17. //进度条颜色
  18. this.percentLineColor = '#FB8F23';
  19. //字体大小
  20. this.fontSize = uni.upx2px(42);
  21. //字段颜色
  22. this.fontColor = '#FB8F23';
  23. }

2.2 chart.js中定义绘图函数

         每次绘制前,需要先清理画布,先执行canvas的clearRect()函数,绘制完成记得执行draw()函数,否则页面不会显示绘图内容。代码如下:

  1. /**
  2. * 绘制圆环
  3. */
  4. drawCircle(){
  5. //清空画面
  6. this.ctx.clearRect(0, 0, this.radius, this.radius);
  7. //计算实际半径
  8. let _radius = this.radius/2-this.padding-this.lineWidth;
  9. //开始绘制圆环
  10. this.ctx.beginPath();
  11. this.ctx.arc(this.radius/2,this.radius/2,_radius,0,Math.PI*2, false);
  12. this.ctx.lineWidth = this.lineWidth;
  13. this.ctx.strokeStyle = this.lineColor;
  14. this.ctx.stroke();
  15. //绘制进度条部分
  16. this.ctx.beginPath();
  17. this.ctx.lineCap = 'round';
  18. this.ctx.arc(this.radius/2,this.radius/2,_radius,-(Math.PI / 2), ((Math.PI * 2) * this.percent) - Math.PI / 2, false);
  19. this.ctx.strokeStyle = this.percentLineColor;
  20. this.ctx.stroke();
  21. //恢复之前保存的绘图上下文
  22. this.ctx.restore();
  23. //绘制文字
  24. this.ctx.font = 'bold '+this.fontSize+'px sans-serif';
  25. this.ctx.setFillStyle(this.fontColor);
  26. this.ctx.setTextAlign('center');
  27. this.ctx.fillText(parseInt((this.percent*100))+'%', this.radius/2+(this.lineWidth/2), this.radius/2+(this.lineWidth/2), this.radius);
  28. //绘制图形
  29. this.ctx.draw();
  30. }

2.3 vue页面中定义对应变量

        CircleBox类定义完成后,先通过import引入CircleBox类,代码如下:

import { CircleBox } from './charts.js';

        在vue页面中,定义相应变量,以便实现交互功能。data中创建相应变量,代码如下:

  1. data() {
  2. return {
  3. cbox1: null, //画布实例对象
  4. percent: 0, //当前进度值
  5. step: .1 //每次修改递增或递减值
  6. }
  7. }

2.4 vue页面中定义初始化函数

        这时,可以在methods中定义个初始化函数,来展示下图表,代码如下:

  1. methods: {
  2. initCircle1(){
  3. //实例对象
  4. this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));
  5. //开始绘制
  6. this.cbox1.drawCircle();
  7. }
  8. }

        图表需要在页面中渲染完成后,通过id获取canvas画布,所以咱们把初始函数放在mounted中执行,代码如下:

  1. export default {
  2. data() {
  3. return {
  4. cbox1: null, //画布实例对象
  5. percent: 0, //当前进度值
  6. step: .1 //每次修改递增或递减值
  7. }
  8. },
  9. mounted() {
  10. this.initCircle1();
  11. },
  12. methods: {
  13. initCircle1(){
  14. //实例对象
  15. this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));
  16. //开始绘制
  17. this.cbox1.drawCircle();
  18. }
  19. }
  20. }

这里图表如下图所示:

2.5 vue页面中定义增加和减小函数

        为了方便演示,这里添加了对percent值进行增加或减小功能,代码如下:

  1. methods: {
  2. initCircle1(){
  3. //实例对象
  4. this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));
  5. //开始绘制
  6. this.cbox1.drawCircle();
  7. }
  8. mulEvent(){
  9. //递减
  10. this.percent = this.percent - this.step <= 0 ? 0 : this.percent - this.step;
  11. //修改进度值
  12. this.cbox1.percent = this.percent;
  13. //重新绘制
  14. this.cbox1.drawCircle();
  15. },
  16. addEvent(){
  17. //递增
  18. this.percent = this.percent + this.step >= 1 ? 1 : this.percent + this.step;
  19. //修改进度值
  20. this.cbox1.percent = this.percent;
  21. //重新绘制
  22. this.cbox1.drawCircle();
  23. }
  24. }

        在按钮上添加点击事件,代码如下:

  1. <button type="default" class="btn" @click="mulEvent()">减小</button>
  2. <button type="default" class="btn" @click="addEvent">增加</button>

        这时点击增加,进度条就会随之改变,比如点击2次后,显示为20%,如下图:

 个人觉得,面对定制化功能,通过canvas原生去实现功能,不借助于插件,不仅可以更好实现定制化功能需求和减小不必要的精力消耗,对于后期积累也是至关重要的。后篇也会在此基础上,进行些复杂点图表改造,希望有助于大家。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/254275
推荐阅读
相关标签
  

闽ICP备14008679号