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

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

1.1 vue页面

<template><view class="wrap-box"><view class="echart-box chart01"><view class="title">图表:圆环带进度条</view><view class="content"><canvas canvas-id="chartBox1" id="chartBox1" class="chart"></canvas><view class="btn-box"><button type="default" class="btn">减小</button><button type="default" class="btn">增加</button></view></view></view></view>
</template><script>export default {data() {return {}},mounted() {},methods: {}}
</script><style lang="scss">
@import './index.scss';
</style>

1.2 scss样式文件

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

1.3 创建chart.js文件

/*** 图表 - 圆环带进度条*/
export class CircleBox {constructor(){}
}

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

上图为现在样式

上图为实现后的样式。

二、实现chart图表绘制

2.1 chart.js中定义变量

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

/*** 构造函数* @param {Object} _context*/
constructor(_context){this.ctx = _context;//直径this.radius = uni.upx2px(300);//四周内填充this.padding = uni.upx2px(20);//圆环宽度this.lineWidth = uni.upx2px(20);//圆环颜色this.lineColor = '#297DFE';//当前百分比this.percent = 0;//进度条颜色this.percentLineColor = '#FB8F23';//字体大小this.fontSize = uni.upx2px(42);//字段颜色this.fontColor = '#FB8F23';
}

2.2 chart.js中定义绘图函数

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

/*** 绘制圆环*/
drawCircle(){//清空画面this.ctx.clearRect(0, 0, this.radius, this.radius);//计算实际半径let _radius = this.radius/2-this.padding-this.lineWidth;//开始绘制圆环this.ctx.beginPath();this.ctx.arc(this.radius/2,this.radius/2,_radius,0,Math.PI*2, false);this.ctx.lineWidth = this.lineWidth;this.ctx.strokeStyle = this.lineColor;this.ctx.stroke();//绘制进度条部分this.ctx.beginPath();this.ctx.lineCap = 'round';this.ctx.arc(this.radius/2,this.radius/2,_radius,-(Math.PI / 2), ((Math.PI * 2) * this.percent) - Math.PI / 2, false);this.ctx.strokeStyle = this.percentLineColor;this.ctx.stroke();//恢复之前保存的绘图上下文this.ctx.restore();//绘制文字this.ctx.font = 'bold '+this.fontSize+'px sans-serif';this.ctx.setFillStyle(this.fontColor);this.ctx.setTextAlign('center');this.ctx.fillText(parseInt((this.percent*100))+'%', this.radius/2+(this.lineWidth/2), this.radius/2+(this.lineWidth/2), this.radius);//绘制图形this.ctx.draw();
}

2.3 vue页面中定义对应变量

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

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

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

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

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

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

methods: {initCircle1(){//实例对象this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));//开始绘制this.cbox1.drawCircle();}
}

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

export default {data() {return {cbox1: null,       //画布实例对象percent: 0,        //当前进度值step: .1           //每次修改递增或递减值}},mounted() {this.initCircle1();},methods: {initCircle1(){//实例对象this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));//开始绘制this.cbox1.drawCircle();}}
}

这里图表如下图所示:

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

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

methods: {initCircle1(){//实例对象this.cbox1 = new CircleBox(uni.createCanvasContext('chartBox1'));//开始绘制this.cbox1.drawCircle();}mulEvent(){//递减this.percent = this.percent - this.step <= 0 ? 0 : this.percent - this.step;//修改进度值this.cbox1.percent = this.percent;//重新绘制this.cbox1.drawCircle();},addEvent(){//递增this.percent = this.percent + this.step >= 1 ? 1 : this.percent + this.step;//修改进度值this.cbox1.percent = this.percent;//重新绘制this.cbox1.drawCircle();}
}

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

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

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

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

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

  1. uni app中使用图表

    关于在uni app中运用图表 今天写项目,需要在uni app中使用图表,我使用的是ucharts. 具体操作如下 1.下载 ucharts可以直接在uni app的插件市场下载安装. 先在插件市场 ...

  2. android自定义带进度条的圆形图片

    前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...

  3. 自定义带进度条的WebView , 增加获取web标题和url 回掉

    1.自定义ProgressWebView package com.app.android05; import android.content.Context; import android.graph ...

  4. web app升级—带进度条的App自动更新

    带进度条的App自动更新,效果如下图所示:   技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template><div><van- ...

  5. php 拖拽 上传文件 进度,在Vue中如何实现带进度条的文件拖动上传功能

    这篇文章主要介绍了Vue实现带进度条的文件拖动上传功能,本文通过实例代码给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下 1. 基本界面 content="width=devic ...

  6. uni-app中自定义图表(canvas实现chart图表)开发篇(5)-圆环进度条添加动画效果

    这里增加一篇介绍下进度条动画效果如何添加,前几篇的进度值被修改后,切换效果比较生硬.另外也在第四篇基础上,对图形略作修改.在查看uniapp文档时,没有发现重绘执行函数,小程序中有Canvas.req ...

  7. Android基础控件——SeekBar的自定义,超短代码模仿抖音带有数字拖拽进度条

    前言 在开发中,经常会遇到SeekBar组件的开发,一个高效的自定义SeekBar显得尤为重要,笔者刚好也在项目中大量使用带有数字的拖拽进度条,在深思熟虑后,打算从继承源码形式上,把数字绘制在拖拽进度 ...

  8. 微信小程序canvas 画动态圆环百分比进度条实例 根据手机屏幕宽度自适应放大缩小

    这里是wxml代码: <component-analysis-report active="0" bindselectReport="selectReport&qu ...

  9. 精通Android自定义View(十四)绘制水平向右加载的进度条

    1引言 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制三部曲综合 ...

最新文章

  1. Maven工程构建时报编码警告的解决办法
  2. 信号转换问题 | 模拟电路解决方式
  3. Windows与Linux共享文件夹互相访问
  4. AB1601LED之pwm
  5. c语言取奇数位构成新数,2、给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中.高位...
  6. Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka
  7. java api 测试工具_Java 实现在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  8. java 常见错误_Java常见错误的十大列表(前100名!)
  9. Zookeeper集群详解
  10. spring 之 BeanPostProcessor
  11. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
  12. iOS、mac开源项目及库汇总
  13. 实验:JS判断浏览器中英文版本
  14. 【MPPT】基于MPPT的风力发电系统simulink仿真
  15. 点石互动--kyw之:Google优化圣经翻译
  16. visualmap折线图_echarts折线图实现切断效果
  17. CommDGI: Community detection oriented deep graph infomax 2020 CIKM
  18. c语言 gps课程设计,完整版GPS定位系统设计.doc
  19. 908c语言程序设计,2021考研大纲:武汉轻工大学908C语言程序设计2021年硕士研究生入学考试初试科目考试大纲...
  20. 《惯性导航》第二版秦永元 知识点总结之一 《第一章 绪论》

热门文章

  1. 干货 | “深耕内容”背景下,携程如何做景酒优质内容的挖掘
  2. web开发需要用什么软件
  3. 小米电视android版本最好,小米电视安装当贝桌面+安卓TV最简单好用的NAS播放器...
  4. python控制小爱同学_神秘鸭,用Siri小爱同学语音助手控制你的电脑
  5. Java十年 十大组织 写在2005
  6. DE2-115 SDRAM地址问题
  7. spss-鸢尾花观测数据
  8. 扫码跳转微信网页 网络出错 轻触屏幕重新加载-1001
  9. UNet语义分割模型的使用-Pytorch
  10. 关于自动化测试的定位及一些实践思考