复杂动态仪表盘的思考及实现过程

763 阅读3分钟

最近在公司接到一个仪表盘的需求,于是我就开始对仪表盘着手调查,如何利用 canvas 绘制一个仪表盘,由于之前没有 canvas 绘图的经验,所以我花了一个周末时间研究整个这个需求,最终完美复现了原型设计图,有点小小的成就感。

先放一张实现的最终效果图

分层分析

一个复杂的图形设计一定是分层的,无论是 HTML 还是 PS 的图层设计,一个好的分层设计会让该设计更加条理清晰。

那么,分层设计有什么优势呢?

  • 开发人员可以只关注整个结构中的其中某一层
  • 可以很容易的用新的实现来替换原有层次的实现
  • 可以降低层与层之间的依赖
  • 有利于标准化
  • 利于各层逻辑的复用

所以如果想实现一个复杂仪表盘的设计,那么这个仪表盘一定是分层结构,结合整个设计图,我思索之后将仪表盘由底及高分层如下结构:

底盘

底盘的实现较为简单,固定一个中心点,绘制一个圆,并填充满颜色,代码如下

圆环

圆环的实现较为复杂,其中可以分解为四部分:圆弧、渐变色、终点的圆圈、分段

圆弧

1.指定圆弧宽度

2.指定圆弧边角

3.绘制半圆

渐变色

需要创建一个渐变色条,并将其填充到圆弧上

终点

终点部分实际上是三个圆叠加,底色圆红色,中间圆白色、顶层圆红色

分段

分段圆弧上的部分,简单来说就是继续绘制指定角度和长度的圆弧覆盖上

合并

将以上分步骤合并到一起

效果

将圆环和底盘绘制到一起

圆环圆锥

实现

圆锥圆环就是以圆心位置绘制指定角度和半径的圆,并填充白色

效果

将以上图层合并

箭头

箭头其实是花的时间最长的,一个箭头实际上是一个三角形,那么在改变角度的时候如何固定三角形的位置是个难题,多次尝试之后,我发现只需要已圆心为基准点,三角形底边的中心就是圆心,就可以算出三个角的位置信息。

效果

将以上图层结合

表盘

实现

表盘的实现较为简单,就是绘制两个圆,底层圆有阴影,顶层圆有边线

效果

文字

实现

效果

动画

难题

动画效果是比较难实现的一个流程,因为 canvas 绘图是静态绘图,如何将图片动起来是个难题。

我曾尝试过利用旋转将角度旋转,后来发现每旋转一次就会绘制一次,并不会清空上一次的内容,且新绘制的图层在其他图层之上,这就导致了三角形浮在所有图层之上。

想法

后来我想到了动画的原理,其实就是每一帧绘制一张新的图片,那我只要每一帧将图片擦除,再进行绘制,那么就是一个动态图片了。

实践

完成!

总结

其实实现一个仪表盘没有我想象中那么难,做一个事情之前能先分析好,每一步做什么,做好分层设计,一步一步实现。

我通过这次做仪表,也发现了许多我不了解的知识,我还要更加努力学习更多知识,打好基础,这样我才有信息迎接各种挑战。