这本是一个愉快的季节,但是,呵呵,胡扯! 因为这篇文章的发表时间是2015年的圣诞节,所以我们需要给Style Android用制造出一些节日气氛。感谢读者们,因为有的读者可能没有在庆祝圣诞,有些读者可能还是6月份。
那么问题来了,我们应该做些什么来让这个节日像是真正的节日呢? 最简单的方法:带上圣诞帽,拍个照。

tree

看我多么欢乐!
但是我感觉这个图片有些单调,所以来弄点雪花,让雪花飘下来。
我们可以添加一个包含这个图片的自定义View

res/layout/activity_main.xml

尽管可以通过继承ImageView来实现自定义View,但我决定将 SnowView 和图片分开,这样每次刷新动画的时候不用重新渲染图片,只刷新 SnowView 就行了

SnowView.java

代码很简单。 在View 的 onSizeChanged 方法中初始化 150 个随机位置的雪花对象。 在onDraw方法中画出雪花,然后每隔一段时间就刷新一下位置,需要注意的是onDraw没有立即去执行,而是通过创建一个runnable,这样不会阻塞UI线程
雪花下落是基于Samuel Arbesman的雪花下落的算法

SnowFlake.java

初始化的时候,雪花的随机位置就已经确定了。这是为了确保雪花不会每次画的时候都在开始的位置。当一个雪花的位置超出Canvas的边界之后,它就会被重新放到顶部的一个随机位置,这样就可以循环利用了,避免了重复创建。
当画雪花下落的每一帧的时候,我们首先给SnowFlake添加一个随机数来改变位置,这样可以模仿有小风吹雪花。
在把雪花画到canvas上之前,我们会进行边界检查(如果需要的话,超出边界的就重新放到顶部)

我一直在不断的调整里面的常量来改变下雪的效果直到我感觉满意为止。

最终效果如下:
youtube

当然了,在canvas里面塞这么多东西不是一个好的方法(有其他更好的 比如OpenGL),但是,我现在要去吃火鸡了,所以可能要等下一次了。

源文件地址

版权声明:
Part of this code is based upon “Snowfall” by Sam Arbesman, licensed under Creative Commons Attribution-Share Alike 3.0 and GNU GPL license.
Work: http://openprocessing.org/visuals/?visualID= 84771
License:
http://creativecommons.org/licenses/by-sa/3.0/
http://creativecommons.org/licenses/GPL/2.0/

© 2015, Mark Allison. All rights reserved. This article originally appeared on Styling Android.

Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License