本文参考学习
视频教程-《Android 粒子效果之雨》
效果图:
本文在《【Android效果集】弹幕效果 》基础上实现,建议先阅读完再看本文。
跟着上一篇介绍弹幕效果的文章相比,这一篇其实和上一篇很类似,虽然效果看起来大相径庭,看下实现就会发现很相似,可以学会来然后举一反三做出很多好玩的动画效果!~
我们首先来分析一下每个雨点效果,每个雨点其实就是一条倾斜直线,从屏幕上/左方出来,到屏幕下/右方消失,期间沿着直线的方向移动。
不是很像弹幕吗?弹幕是从右边出来,水平移动到左边出去。
实现思路
1.在上一篇弹幕项目基础上,重构出一个BaseView,自定义RainView代表一个雨滴,继承自BaseView
2.RainView能够自动从最上面移动到最下边,且有一定倾斜角度,移动过程中一直保持着同一个倾斜角度
3.重构提取出单个雨滴类,将RainView改为包含多个雨滴代表一场雨
4.随机定制化,比如倾斜角度,颜色等
详细过程
1.重构出一个BaseView
先上代码,待会解释为什么要重构。
/**
* Created by AZZ on 15/10/20 21:20.
*/
public abstract class BaseView extends View {
protected AnimThread animThread;
protected int windowWidth; //屏幕宽
protected int windowHeight; //屏幕高
public BaseView(Context context) {
super(context);
init();
}
public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
/**
* 初始化
*/
protected void init() {
Rect rect = new Rect();
getWindowVisibleDisplayFrame(rect);
windowWidth = rect.width();
windowHeight = rect.height();
}
//---------------------------------------------------- 画布操作
/**
* 画子类
*/
protected abstract void drawSub(Canvas canvas);
@Override
protected void onDraw(Canvas canvas) {
drawSub(canvas);
if (animThread == null) {
animThread = new AnimThread();
animThread.start();
}
}
//---------------------------------------------------- 动画操作
/**
* 动画逻辑处理
*/
protected abstract void animLogic();
/**
* 里面根据当前状态判断是否需要返回停止动画
* @return 是否需要停止动画thread
*/
protected abstract boolean needStopAnimThread();
/**
* @return 线程睡眠时间,值越大,动画越慢,值越小,动画越快
*/
protected int sleepTime() {
return 30;
}
/**
* 动画结束后做的操作,比如回收资源
*/