uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条
经常开发中,会遇到各种各样图表,这时大家普遍会想到去找插件。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)-圆环带进度条相关推荐
- uni app中使用图表
关于在uni app中运用图表 今天写项目,需要在uni app中使用图表,我使用的是ucharts. 具体操作如下 1.下载 ucharts可以直接在uni app的插件市场下载安装. 先在插件市场 ...
- android自定义带进度条的圆形图片
前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...
- 自定义带进度条的WebView , 增加获取web标题和url 回掉
1.自定义ProgressWebView package com.app.android05; import android.content.Context; import android.graph ...
- web app升级—带进度条的App自动更新
带进度条的App自动更新,效果如下图所示: 技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template><div><van- ...
- php 拖拽 上传文件 进度,在Vue中如何实现带进度条的文件拖动上传功能
这篇文章主要介绍了Vue实现带进度条的文件拖动上传功能,本文通过实例代码给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下 1. 基本界面 content="width=devic ...
- uni-app中自定义图表(canvas实现chart图表)开发篇(5)-圆环进度条添加动画效果
这里增加一篇介绍下进度条动画效果如何添加,前几篇的进度值被修改后,切换效果比较生硬.另外也在第四篇基础上,对图形略作修改.在查看uniapp文档时,没有发现重绘执行函数,小程序中有Canvas.req ...
- Android基础控件——SeekBar的自定义,超短代码模仿抖音带有数字拖拽进度条
前言 在开发中,经常会遇到SeekBar组件的开发,一个高效的自定义SeekBar显得尤为重要,笔者刚好也在项目中大量使用带有数字的拖拽进度条,在深思熟虑后,打算从继承源码形式上,把数字绘制在拖拽进度 ...
- 微信小程序canvas 画动态圆环百分比进度条实例 根据手机屏幕宽度自适应放大缩小
这里是wxml代码: <component-analysis-report active="0" bindselectReport="selectReport&qu ...
- 精通Android自定义View(十四)绘制水平向右加载的进度条
1引言 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制三部曲综合 ...
最新文章
- Maven工程构建时报编码警告的解决办法
- 信号转换问题 | 模拟电路解决方式
- Windows与Linux共享文件夹互相访问
- AB1601LED之pwm
- c语言取奇数位构成新数,2、给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中.高位...
- Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka
- java api 测试工具_Java 实现在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
- java 常见错误_Java常见错误的十大列表(前100名!)
- Zookeeper集群详解
- spring 之 BeanPostProcessor
- 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
- iOS、mac开源项目及库汇总
- 实验:JS判断浏览器中英文版本
- 【MPPT】基于MPPT的风力发电系统simulink仿真
- 点石互动--kyw之:Google优化圣经翻译
- visualmap折线图_echarts折线图实现切断效果
- CommDGI: Community detection oriented deep graph infomax 2020 CIKM
- c语言 gps课程设计,完整版GPS定位系统设计.doc
- 908c语言程序设计,2021考研大纲:武汉轻工大学908C语言程序设计2021年硕士研究生入学考试初试科目考试大纲...
- 《惯性导航》第二版秦永元 知识点总结之一 《第一章 绪论》
热门文章
- 干货 | “深耕内容”背景下,携程如何做景酒优质内容的挖掘
- web开发需要用什么软件
- 小米电视android版本最好,小米电视安装当贝桌面+安卓TV最简单好用的NAS播放器...
- python控制小爱同学_神秘鸭,用Siri小爱同学语音助手控制你的电脑
- Java十年 十大组织 写在2005
- DE2-115 SDRAM地址问题
- spss-鸢尾花观测数据
- 扫码跳转微信网页 网络出错 轻触屏幕重新加载-1001
- UNet语义分割模型的使用-Pytorch
- 关于自动化测试的定位及一些实践思考