前段时间在某效果网站看到开源项目【ExplosionField】非常喜欢,于是自己跟着源码学习着去做了做。跟源码效果有一点区别,我都是尽力读懂源码然后用自己的理解写出来,源码有些看不懂的地方,我也就没有用到,因为自己的代码要保证自己都能看懂。
最后效果如下:
(本文适合有一年Android开发经验者学习)
本文可以学到:
1.开源项目ExplosionField的实现思路
2.图示效果的实现过程
3.属性动画的用法
实现思路:
1.新建一个 Bean Particle
,表示一个粒子对象;新建一个 View ExplosionField
作为画布用来显示破碎的粒子;新建一个属性动画(ValueAnimator) ExplosionAnimator
用来改变不同时刻的粒子状态;
2.通过View
生成图片Bitmap
,把生成的图片分解成若干个粒子,让每个粒子记录特定的位置,所有的粒子组合能看出是原图。
3.加上动画效果,使得点击View
后,粒子能有所变化。
4.构思算法,形成不一样的效果。
5.匹配不同分辨率的设备。
6.重构。
详细过程:
可以先看看项目结构,非常简单:
1.新建对象
1.1 新建Particle
对象,用来描述粒子,包括属性有颜色、透明度、圆心坐标、半径。
public class Particle {
float cx; //center x of circle
float cy; //center y of circle
float radius;
int color;
float alpha;
}
1.2 新建ExplosionField
对象,继承自View
,用于做粒子集的画布,需要重写onDraw()
方法
public class ExplosionField extends View{
public ExplosionField(Context context) {
super(context);
init();
}
public ExplosionField(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
//初始化
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制粒子
}
}
1.3 新建ExplosionAnimator
,继承自ValueAnimator
,用来执行自定义动画。ValueAnimator
简单来说就是在一段时间内通过不断改变值(一般是改变某个属性的值)来达到动画效果。更多可以参考《Android属性动画完全解析(上),初识属性动画的基本用法》来学习。
而我们现在是准备在一段时间内(大概1.5秒)让ValueAnimator
里的值从0.0f
变化到1.0f
,然后根据系统生成的递增随机值(范围在0.0f~1.0f
)改变Particle
里的属性值。
public class ExplosionAnimator extends ValueAnimator{
public static final int DEFAULT_DURATION = 1500;
public ExplosionAnimator() {
setFloatValues(0.0f, 1.0f);
setDuration(DEFAULT_DURATION);
}
}
这样,在1.5秒内,通过ExplosionAnimator
的方法getAnimatedValue()
就能够不断得到递增的范围在0.0f~1.0f
之间的值。
2.复制出View的快照图片
首先通过view
的宽高创建出一个同样大小的空白图,用Bitmap
的静态方法createBitmap()
创建,最后一个参数表示图片质量。
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
然后通过画布Canvas
,先把空白图设置到画布里,再让view