您现在的位置是:首页 > 学无止境 > 其他网站首页其他 利用canvas画一个简单酷炫的数字时钟

利用canvas画一个简单酷炫的数字时钟

  • 莫愁
  • 其他
  • 2019-04-04
简介用canvas来做数字时钟是因为canvas性能方面会比js好,因为就单单操控每个点的运动,用js控制dom的style属性跟用js控制canvas绘图相比性能方面肯定是有所欠缺的。所以我下面介绍一篇用canvas来画一个简单酷炫的数字时钟。
字数 3600

利用canvas画一个简单酷炫的数字时钟

先上DEMO吧,然后再简述一下做这个的方法:   看DEMO请戳我 。

做这个思路很简单,就是通过字符串保存各个数字的位置:

0代表没像素,1代表有像素,/是为了更好看些,就是分行嘛,简单说起来:比如0就是:

  1  1  1  1

  1  0  0  1

  1  0  0  1

  1  0  0  1

  1  0  0  1

  1  0  0  1

  1  1  1  1  

这样就很清楚了吧。从0到9还有一个":"号都用字符串表示好。

然后就写个粒子对象,也就是像素点:

粒子对象的属性比较简单,就位置,速度,以及是否可视化。方法的话,paint是绘制方法,reset是重置(因为粒子要循环利用的,提升性能),isDrop是粒子落下方法,update就是每一帧更新粒子的动作,update中当粒子运动超出canvas的绘制区域时,就把它的可视化置为false,在粒子容器中保存起来等待下一次调用。

写好粒子对象后,就要考虑如何让粒子按照位置画上去,同时当粒子不需要用时能够让他做自由落体的动画了。

先画背景(也就是那没有像素的白点):

先把背景画到一个离屏canvas中缓存起来,接下来每一帧重画的时候就不需要逻辑计算了,直接把那个离屏canvas画上去就行了。上面的逻辑应该不难理解,就是通过两个循环,循环8个数字,然后再对每个数字一个点一个点进行绘制,当遇到“/”时,就说明要换行了,把绘制的ty加个换行间隔,再把tx重置,再进行绘制。就这样,点就可以都画出来了。效果图如下:

利用canvas画一个简单酷炫的数字时钟

背景画好了,就开始根据每一秒的时间,画数字像素吧。方法主要是这个:

原理也不难,也是跟上面画背景差不多,遍历所有点,然后根据当前时间的数字转换成的字符串来判断,当前点是否应该有像素,如果有像素就再判断当前这个点是否已经有粒子对象在了,如果已经有粒子对象在了,就直接跳出不处理,如果没有粒子对象在,就再粒子容器中找一个没有被使用的粒子reset到这个位置。还有一种情况,就是当前这个点是不应该有像素的,但是却有粒子,那就获取这个粒子,让这个粒子进行自由落体。

时间设置也写好了,就可以写舞台更新的代码了:

在initAnimate进行动画初始化,初始化也就是先实例化两百个粒子对象放到粒子容器中保存起来,再更新时间戳,缓存背景,设置当前时间,然后调用animate动画循环主体开始动画。

animate中的逻辑也很简单了,获取时间戳,如果两个时间戳之间的时间差大于或等于1秒,就进行setTime。而再下面的就是对粒子容器里的所有可视化的粒子进行遍历循环重绘了。

然后就做好啦:

当然这个效果还是有很多可以优化的地方的,因为时钟和分钟都是动的比较少的,所以可以把这两个缓存起来,当没有动作的时候就直接将缓存数据画上去就行了,这样就可以减少舞台每一帧的绘图API调用量,肯定是能提高性能的。不过现在毕竟粒子不多,两三百个粒子对象也就够用了,如果不去做优化,动画也还是能很流畅的运行的。所以楼主就偷个小懒啦。


转载: 感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/148.html”。

文章评论

    • 评论
    人参与,条评论

技术在线

服务时间

周一至周日 12:00-22:00

关闭下雪
关闭背景特效