明天就是五一劳动节了,在这里先祝各位程序猿劳动节快乐,别在加班了!
自从尝试过写自定义View(Android自定义View初探(一)——饼图)之后,每当看到别人的应用时,总是在想别人的实现方式,或许,这就是程序猿的悲哀吧O(∩_∩)O~。
前两天就想尝试去用自定义View实现360的垃圾清理界面了,只是最近一直在忙dicuz自定义修改,所以就先放下了。不过马上放五一了,没太多事,今天就来做一些新的尝试吧。
我这里既然写到了是“仿”360,所以大家千万别在看完后丢砖头哈,毕竟我只看到了它的表象,谁知道它是个神马呢?
其实当时看完它的界面后觉得应该就是简单的背景色切换随机元素的绘制:
1.刚进界面的时候是一种颜色,比如深绿,点击“开始扫描”(360可木有,他是自动扫描);
2.当垃圾的数量达到一定值后,比如100MB,背景色变色,比如蓝色,;当垃圾值达到200MB的时候再变色,比如红色;
3.垃圾值的增量(就是那些飞来飞去的小垃圾块)的位置是随机的,只不过搜集垃圾时,坐标是从四面往中间移动;释放垃圾时,坐标是从中间往四面移动(效果可自己随意定);
4.释放垃圾时,按钮变成了进度条(这个可以实现,但我没做^_^)。
5.还有些细节有待发现。。。
说了这么多,大家也不知道我在说什么^_^,我就不唠叨了,代码有注释。
照例先上效果图:
初始状态
搜集状态-小于100MB
搜集状态-大于100MB小于300MB
搜集状态-大于300MB
搜集完成状态
释放状态和搜集状态的颜色变化是相同的,不同的是小垃圾的移动方式,这里就不贴图片了,太多了。
下面就贴大家最喜欢大代码了^_^:
/**
* @author MR.yan
*
*/
public class ShaderView extends View
{
/**
* 绘画初始状态
*/
private static final int STATE_DRAW_INIT = 1;
/**
* 绘画垃圾搜集中状态
*/
private static final int STATE_DRAW_COLLECTING_GABAGE = STATE_DRAW_INIT + 1;
/**
* 绘画垃圾搜集完成状态
*/
private static final int STATE_DRAW_COLLECTED_GABAGE = STATE_DRAW_INIT + 2;
/**
* 绘画垃圾搜释放中状态
*/
private static final int STATE_DRAW_RELEASE_GABAGE = STATE_DRAW_INIT + 3;
/**
* 默认水平间距(dp)
*/
private static final float DEFAULT_WIDTH_PADDING = 15;
/**
* 默认垂直间距(dp)
*/
private static final float DEFAULT_HEIGHT_PADDING = 5;
/**
* 画笔
*/
private Paint paint;
/**
* 屏幕密度
*/
private float density;
/**
* 屏幕宽度px
*/
private float width;
/**
* 屏幕高度px
*/
private float height;
/**
* 当前绘画状态
*/
private int mState = STATE_DRAW_INIT;
/**
* 圆角矩形
*/
private RectF rectF;
/**
* 矩形
*/
private Rect rect;
/**
* 随机数器
*/
private Random random = new Random();
/**
* 已搜集的垃圾总数
*/
private float gabageSize = 0.0f;
/**
* 垃圾逻辑处理的线程开关
*/
private boolean isRun;
/**
* 小垃圾的x坐标(px)
*/
private float littleGabageX;
/**
* 小垃圾的y坐标(px)
*/
private float littleGabageY;
/**
* 每次随机产生的小垃圾数量