背景
直播间动画需求,支持 樱花飘落,萤火虫飞舞,流星飞逝, 密集雨点等;所以需要一套粒子动画框架来支持这套动画的开发。
支持粒子规模控制,控制粒子喷发速率,喷发规模;
项目源码
github.com/brijoe/Part…
控件技术选型
方案设计
- 考虑问题 1 UI线程 还是子线程
- 控件如何选取
功能上:对比差异
性能上:哪个性能更好
子线程选择 绘制控件 SurfaceView 控件 vs TextureView .
设计结构
EffectsManager
管理类 业务层访问此类来进行粒子动画控制。
设置效果ID
开启特效
关闭特效
释放资源
ParticleView
负责双缓冲绘制
控制绘制速率
开启关闭绘制线程等
释放资源等
ParticleDraw
根据粒子特性 控制粒子的添加或者移除;
ParticleBase
粒子效果约束
属性重置
粒子数量定义
粒子出现速率定义
设计思路
1. 樱花飘落
从画布右边向左方向移动,运动曲线随机,透明度有变化,旋转角度缓慢转动。
运动曲线 用二阶贝塞尔模拟。
2. 萤火虫飞舞
从画布右边向下往上方向移动,忽明忽暗不均匀,速度不均匀,纵向非直线运动,出现位置和消失位置不固定。
运动曲线 用三阶贝塞尔模拟。
3. 流星飞逝
从画布右上到做下方向移动,直线运动,大小长度和透明度有变化。
4. 密集雨点
从画布从上到下运动,雨线长短粗细不一,运动速度不同。
内存优化
- 资源及时释放
- 根据硬件配置升级降级特效
public static Performance getPerformance(Context context) {
int year = YearClass.get(context);
Log.d(TAG, "getPerformance: " + year);
if (year >= YearClass.CLASS_2013) {
// Do advanced animation
return Performance.HIGH;
} else if (year > YearClass.CLASS_2010) {
// Do simple animation
return Performance.MEDIUM;
} else {
// Phone too slow, don't do any animations
return Performance.LOW;
}
}
参考Facebook 开源的方案来判断高低端机型。
github.com/facebookarc…