ExplosionView 的绘制过程
explosionView是一个粒子爆炸的view效果, 可以把view添加到explosionview中, 在点击该view的时候, view会变成粒子爆碎开, 掉到屏幕底部,动画结束后在恢复原样。
效果图
知识点:
1.快速创建一个属性动画
view.animate() //给view创建一个属性动画
.alpha(1f) //设置透明度
.translationX(10) //X轴移动
.scaleX(1.5) //X轴缩放
.setDuration(150) //设置动画时间
.start(); //启动动画
2.bitmap获取到指定位置的像素颜色
bit.getPixel(x, y)
概述
主要分为两个部分:
- ExplosionLayout是用来播放动画的一个壳子,主要任务是
- 初始化的时候创建一个覆盖全屏的view ,用来承载view的绘制
- 监听View的点击事件,在view被点击之后,执行动画效果 获取到view的位置和bitmap图像,根据传进来的不同类型,播放不同的动画效果
- Explosion作为一个抽象类,主要是方便更换不同的效果,主要子类1.Particle,2.Shredder 在ExplosionLayout中改变type来切换不同的效果
第一部分 ExplosionLayout
- 初始化的时候创建一个覆盖全屏的view ,用来承载view的绘制
private void attach2Activity(Activity activity) {
ViewGroup rootView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
rootView.addView(this, lp);
}
- 监听View的点击事件,在view被点击之后,执行动画效果
/**
* 给view 一个监听,当被点击的时候,执行动画效果
*
* @param view
*/
public void addLinstener(final View view) {
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
explosion(view);
}
});
}
/***
* 给 view 添加动画效果
*
* @param view
*/
private void explosion(final View view) {
//获取到传进来view 的位置信息
Rect mRect = new Rect();
view.getGlobalVisibleRect(mRect);
//因为状态栏的高度问题, 这里要进行一个高度的偏移
mRect.offset(0, -DensityUtils.dp2px(view.getContext(), 21));
Bitmap bit = createBitmapFromView(view);
Explosion explosion;
if (type == TYPE_SHREDDER) {
explosion = new Shredder();
} else {
explosion = new Particle();
}
final ValueAnimator explosionAnimation = ValueAnimator.ofObject(new ExplosionEvaluator(explosion, bit, mRect),
new Shredder(0), new Shredder(1));
explosionAnimation.setDuration(animation_time);
//不能重复添加
if (explostionSet.containsKey(view)) {
return;
}
explostionSet.put(view, explosionAnimation);
explosionAnimation.addListener(new AnimatorListenerAda