本期大纲

1、饼图绘制
2、如何添加动画效果
3、使用rollup构建项目

相关阅读:
在微信小程序中绘制图表(part1)
在微信小程序中绘制图表(part2)

关注我的 github 项目 查看完整代码。

很久没更新了,最近事情比较多,今天来把坑填上!

饼图绘制

先看一下API

下面开始(使用ES6语法编写,后面我们可以使用rollup编译成ES5的语法)

假设我们有这样的数据

const series = [{data: 15, color: '#7cb5ec'},{data: 35, color: '#f7a35c'},{data: 78, color: '#434348'},{data: 63, color: '#90ed7d'}
];

计算出各项所占的比例和开始的弧度

calPieData.js

export function calPieAngle (series) {// 计算数据总和let count = 0;series.forEach((item) => {count += item.data;});// 计算出开始的弧度和所占比例let startAngle = 0;return series.map((item) => {item.proportion = item.data / count;item.startAngle = startAngle;startAngle += 2 * Math.PI * item.proportion;return item;});
}

数据已经计算出来了,下面让我开始绘制吧

drawPieChart.js

import { calPieAngle } from 'calPieData'export default function drawPieChart (series) {...let pieSeries = calPieAngle(series);pieSeries.forEach((item) => {context.beginPath();// 设置填充颜色context.setFillStyle(item.color);// 移动到原点context.moveTo(100, 100);    // 绘制弧度context.arc(100, 100, 80, item.startAngle, item.startAngle + 2 * Math.PI * item.proportion);context.closePath();context.fill();});...}

调用drawPieChart(series)就可以得到下面的结果:

很简单是不是,下面我们给各区块加上一个白色的分割线
因为arc实际上是绘制了一条路径,所以我们简单的stroke描边一下就可以了


...context.setLineWidth(2);
context.setStrokeStyle('#ffffff');
pieSeries.forEach((item) => {context.beginPath();context.setFillStyle(item.color);context.moveTo(100, 100);    context.arc(100, 100, 80, item.startAngle, item.startAngle + 2 * Math.PI * item.proportion);context.closePath();context.fill();context.stroke();
})...

添加动画效果

首先让我们创建一个动画工具,这个动画工具能够传入一些自定义的参数,比如动画时间,能够有动画每一步的回调以及动画结束的回调

animation.js

export default function Animation (opts) {// 处理用户传入的动画时间,默认为1000ms// 因为用户有可能传入duration为0,所以不能用opts.duration = opts.duration || 1000 来做默认值处理// 否则用户传入0也会处理成默认值1000opts.duration = typeof opts.duration === 'undefined' ? 1000 : opts.duration;let startTimeStamp = null;function step (timestamp) {if (startTimeStamp === null) {startTimeStamp = timestamp;} if (timestamp - startTimeStamp < opts.duration) {// 计算出动画的进度let process = (timestamp - startTimeStamp) / opts.duration;// 触发动画每一步的回调,传入进度processopts.onProcess && opts.onProcess(process);// 动画进行中,执行下一次动画requestAnimationFrame(step);} else {// 动画结束opts.onProcess && opts.onProcess(1);// 触发动画结束回调opts.onAnimationFinish && opts.onAnimationFinish();}}requestAnimationFrame(step);
}

动画使用了requestAnimationFrame,并且已经满足了我们上面定义的需求
在实战中,此处的动画都是线性的,一般我们还会加入缓动选项,比如缓入缓出,还有一点,在微信小程序真机中IOS设备是不支持requestAnimationFrame的,所以要做降级处理,使用setTimeout,查看完整的代码

下面我们调用animation来完成动画效果

app.js

import Animation from 'animation'
import drawPieChart from 'drawPieChart'Animation({duration: 1000,onProcess: (process) => {drawPieDataChart(series, process);}
});

修改一下drawPieDataChart function,能够接受process参数


...export default function drawPieChart (series, process = 1) {...// 将process传入给calPieAngle,计算出对应进度下的图表角度数据let pieSeries = calPieAngle(series, process);...

同样,修改一下calPieAngle function,能够接受process参数


export function calPieAngle (series, process = 1) {...// 计算出开始的弧度和所占比例let startAngle = 0;return series.map((item) => {// 计算出当前动画进度的比例item.proportion = item.data / count * process;item.startAngle = startAngle;startAngle += 2 * Math.PI * item.proportion;return item;});
}

好了,现在我们的动画就可以动起来了,类似这样

使用rollup构建项目

Rollup is a next-generation JavaScript module bundler. Author your app or library using ES2015 modules, then efficiently bundle them up into a single file for use in browsers and Node.js.

也就是说rollup是一个前端构建工具,能够将我们的整个项目合并输出成一个最终的编译结果,上面我们编写代码的时候都是按照不同的功能放到不同的文件中,这样有利于后期的可持续性开发和维护,rollup正好能帮助我们构建出最后的编译结果

先安装rollup

npm install -g rollup

添加对ES6的支持

npm install --save-dev rollup-plugin-babel
npm install --save-dev babel-preset-es2015-rollup

创建.babelrc文件在项目根目录,告诉babel转义时使用哪个presets

{"presets": ["es2015-rollup"],
}

好了剩下最后一步,定义我们的rollup.config.js配置文件

import babel from 'rollup-plugin-babel';export default {// 入口文件entry: 'app.js',// 输出格式,这里使用commonJSformat: 'cjs',// 输出文件dest: 'dist/charts.js',// 使用babel进行ES6转ES5plugins: [babel({exclude: 'node_modules/**',})]
};

rollup会从入口文件开始,查找我们的依赖(import),逐级往下深入,把依赖的文件全部收集起来并合并到一起,最后输出到我们定义的dest文件中

执行

rollup -c

好了,我们就得到了我们最后的项目编译文件charts.js

下期预告

下一期中我一起讨论下有技术含量的内容,关于图表中文案显示的检测碰撞问题,大概效果会是这样的,红框部分文案发生了碰撞,这里完成了避让,能够正常显示

在微信小程序中绘制图表(part3)相关推荐

  1. 在微信小程序中绘制图表(part2)

    本期大纲 1.确定纵坐标的范围并绘制 2.根据真实数据绘制折线 相关阅读: 在微信小程序中绘制图表(part1) 在微信小程序中绘制图表(part3) 关注我的 github 项目 查看完整代码. 确 ...

  2. 微信小程序中绘制图表 (AntV F2 的使用)

    1.安装小程序F2组件 npm i @antv/f2-canvas 2.安装好相关依赖包之后,使用微信开发者工具运行项目,点击开发者工具顶部详情,勾选 使用npm模块,再点击菜单栏中工具下的构建npm ...

  3. 如何在微信小程序中使用ECharts图表

    在微信小程序中使用ECharts 1. 下载插件 首先,下载 GitHub 上的 ecomfe/echarts-for-weixin 项目. 下载链接:ecomfe/echarts-for-weixi ...

  4. 在H5、微信小程序中使用canvas绘制二维码、分享海报

    在H5.微信小程序中使用canvas绘制二维码.分享海报 文章目录 在H5.微信小程序中使用canvas绘制二维码.分享海报 前言 一.canvas绘制二维码 1.H5中使用canvas 2.微信小程 ...

  5. 微信小程序setinterval_微信小程序中setInterval的使用方法

    微信小程序中setinterval的使用方法 看了下小程序的画布功能,简单的使用了一下,用蹩脚的逻辑做了个 "弹啊弹,弹走鱼尾纹的小球",一起来看下吧.过程不重要主要是画布的使用哦 ...

  6. 微信小程序-canvas绘制文字实现自动换行

    微信小程序-canvas绘制文字实现自动换行 在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生 ...

  7. Canvas绘图在微信小程序中的应用:生成个性化海报

    Canvas绘图在微信小程序中的应用:生成个性化海报 如极客时间的一些实现案例: 基础语法 Canvas本质是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素,默认大小为30 ...

  8. 微信小程序给echarts图表动态赋值

    微信小程序给echarts图表动态赋值 接上一篇:微信小程序引入echart图表 直接上例子(运行需要结合上一篇,拉至文章顶部进入): import * as echarts from '../../ ...

  9. 微信小程序中使用ECharts--折线图、柱状图、饼图等

    微信小程序开发者的反馈,表示他们强烈需要像 ECharts 这样的可视化工具.但是微信小程序是不支持 DOM 操作的,Canvas 接口也和浏览器不尽相同. 因此,ECharts 团队和微信小程序官方 ...

最新文章

  1. phpstudy更改但是php版本没变
  2. mysql utf8 cmd,MySQL Windows下cmd显示中文乱码
  3. 机器学习实验中的编程技术(part3)--numpy
  4. 对比关系生成模型(Comparative Relation Generative Model)
  5. Java 程序 ——感想
  6. 计算机表情识别技术研究学什么,表情识别的图像预处理和特征提取方法研究
  7. 百度图神经网络——论文节点比赛baseline代码注解
  8. 显示lib包_Java 添加、删除、移动、隐藏/显示Excel工作表
  9. HTML5期末大作业:书店商城系统网站设计——响应式图书电商HTML 网上书店模板 (25页) HTML+CSS+JavaScript
  10. 数字阵列麦克风处理技术概述
  11. 使用R语言进行一元回归
  12. Win11、10下安装enspHCL,解决兼容问题
  13. android10 systemUI亮度调节分析
  14. MPEG-7描述子(0)——颜色空间
  15. 怎么复制网页上不能复制的文字(付费文档免费复制),一招搞定
  16. android软键盘上添加一个按钮
  17. html笔记(完整版)
  18. 康托展开(八数码问题)
  19. oracle存档模式,oracle归档模式管理
  20. 分布式文件存储系统Minio使用总结

热门文章

  1. JavaSE语法基础总结
  2. 拖动精灵的三种方法比较
  3. lua4.0中实现% 取余操作
  4. webpack初体验_使用webpack打包js文件_json文件_使用webpack开发模式_生产模式打包---webpack工作笔记003
  5. Sentinel热点Key降级上_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0042
  6. springcache使用笔记002_注释驱动的 Spring cache 按条件查询
  7. jsp调试,异常行数不匹配
  8. Struts2 + Hibernate + Spring 以及javaweb模块问题解决(1)
  9. 杭电5253连接的管道
  10. win32开发(创建子窗口)