最近看到一段时间都没怎么更新文章了,一直在学习iOS相关内容。偶然间看到一个碎裂的粒子效果,觉得很有意思,就查了查,参考下网上的思路自己撸了个轮子。

好了,说了这么多,先看看效果吧~

粒子破碎效果

依惯例,先说下行文思路吧,首先我们先简单分析下效果,拆分关注点,粒子效果是怎么产生的?我的解决方案就是先获取当前要碎裂的view的缓存视图,然后根据图片获取各个坐标点的颜色值,在整个DecorView盖上一层视图,这个视图就根据获取的颜色值在要碎裂的view的位置来drawCircle,之后变化圆心和半径以及透明度从而产生碎裂效果。那么,我们要解决的问题已经简化为几个点了,看怎么一个一个将其击破。

一、获取view的视图

二、获取要碎裂的view的位置以及获取各个位置的颜色值

三、变化各个属性值产生动画碎裂效果

一、获取view的视图

获取view的视图也就是要获取这个视图的截图,有两种方式可以来做:

1、可以用Canvas来获取Bitmap

public Bitmap getBitmapFromView(View view) {

Bitmap bmp = Bitmap.createBitmap(webView.getWidth(),

webView.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

view.draw(canvas);

return bmp;

}

2、用getDrawingCache来获取Bitmap

private static Bitmap getCacheBitmapFromView(View view) {

final boolean drawingCacheEnabled = true;

view.setDrawingCacheEnabled(drawingCacheEnabled);

view.buildDrawingCache(drawingCacheEnabled);

final Bitmap drawingCache = view.getDrawingCache();

Bitmap bitmap;

if (drawingCache != null) {

bitmap = Bitmap.createBitmap(drawingCache);

view.setDrawingCacheEnabled(false);

} else {

bitmap = null;

}

return bitmap;

}

通过这两种方式都可以获取这个视图的图片,而为什么我们要获取这个视图的图片呢,因为要根据这个图片来获取各个位置的颜色值,为之后绘制粒子效果服务。

二、获取要碎裂的view的位置以及获取各个位置的颜色值

获取view的位置,之前使用过getGlobalVisibleRect方法来获取位置,但很多时候并不是很准确,比如有ActionBar的时候。

Rect rect = new Rect();

view.getGlobalVisibleRect(rect);

之后测试使用getLocationInWindow这种方式挺不错,这个方法的官方注释为这样写Computes the coordinates of this view in its window.:

int[] location = new int[2];

view.getLocationInWindow(location);

Rect rect = new Rect(location[0],location[1],location[0]+view.getMeasuredWidth(),location[1]+view.getMeasuredHeight());

在获取视图位置之后,我们要获取各个位置的颜色值来绘制在这片区域内,调用bitmap.getPixel方法获取各个位置的颜色值:

public static Particle[][] generateParticles(Bitmap bitmap, Rect bound) {

int w = bound.width();

int h = bound.height();

int partW_Count = w / Particle.PART_WH;

int partH_Count = h / Particle.PART_WH;

Particle[][] particles = new Particle[partH_Count][partW_Count];

Point point = null;

for (int row = 0; row < partH_Count; row ++) { //行

for (int column = 0; column < partW_Count; column ++) { //列

//取得当前粒子所在位置的颜色

int color = bitmap.getPixel(column * Particle.PART_WH, row * Particle.PART_WH);

point = new Point(column, row); //x是列,y是行

particles[row][column] = Particle.generateParticle(color, bound, point);

}

}

return particles;

}

三、变化各个属性值产生动画碎裂效果

首先我们要在当前视图上覆盖一层产生碎裂效果的视图:

private void attachToActivity(Activity activity) {

ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

rootView.addView(this, lp);

}

将我们要绘制粒子动画效果的添加进布局视图中,然后我们就可以开始绘制了。

开启属性动画,根据动画流程变化Particle的相关属性:

//x值

public float cx;

//y值

public float cy;

//绘制圆的半径

public float radius;

//颜色

public int color;

//透明度

public float alpha;

在自定义视图的onDraw方法,遍历所有我们保存的粒子Particle,改变相关属性值:

@Override

protected void onDraw(Canvas canvas) {

if (mParticleAnimator !=null)

drawParticle(canvas);

}

public void drawParticle(Canvas canvas) {

//动画结束停止

if(!mParticleAnimator.isRunning()) {

return;

}

for (Particle[] particle : mParticleAnimator.getParticles()) {

for (Particle p : particle) {

p.update((Float) mParticleAnimator.getAnimatedValue());

mPaint.setColor(p.color);

mPaint.setAlpha((int) (Color.alpha(p.color) * p.alpha));

canvas.drawCircle(p.cx, p.cy, p.radius, mPaint);//

}

}

invalidate();

}

//更新相关属性值 主要是随机生成x y值以及碎裂大小

public void update(float factor) {

cx = cx + factor * random.nextInt(mBound.width()) * (random.nextFloat() - 0.5f);

cy = cy + factor * (mBound.height()/(random.nextInt(4)+1)) ;

radius = radius - factor * random.nextInt(3);;

if (radius<=0)

radius = 0;

alpha = 1f - factor;

}

OK,到这里我们就基本实现了这个碎裂效果,整体注意点基本就这么多,我把它简单封装了下,使用方式也很简单:

final ParticleView particleAnimator = new ParticleView(MainActivity.this,3000);//3000为动画持续时间

particleAnimator.setOnAnimationListener(new ParticleView.OnAnimationListener() {

@Override

public void onAnimationStart(View view,Animator animation) {

//动画开始

view.setVisibility(View.INVISIBLE);

}

@Override

public void onAnimationEnd(View view,Animator animation) {

//动画结束

}

});

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

particleAnimator.boom(v);//开始动画

}

});

android 矢量粒子动画,Android碎裂的粒子效果相关推荐

  1. android 矢量粒子动画,iOS CAEmitterLayer实现粒子发射动画效果

    iOS实现粒子发射动画效果图 动画效果用 CAEmitterLayer 实现.CAEmitterLayer 显示粒子发射动画,具体的粒子由 CAEmitterCell 封装.代码示例是展示 CAEmi ...

  2. android 粒子动画,使用animator实现粒子动画效果

    1.前言 本文围绕着实现粒子放大效果,着重讲解android中涉及到动画缩放以及动画集的使用,并且会将讲解一些插值器相关的知识.阅读本文需要读者有一定的自定义View的基础知识,本文将不再讲解自定义V ...

  3. Android矢量图动画特效,Android矢量动画实践

    之前的文章里,有朋友评论说饿了么的动画是使用AnimatedVectorDrawable来实现的.这个东西虽然原来也知道,但是一直没有切实的使用过.刚好昨天有看到一个蛮帅的矢量动画(文末福利),有了兴 ...

  4. android 矢量图动画,Android-Animation-Set

    Ⅷ. AnimatedVectorDrawable / 矢量图动画 要想彻底搞明白 Android 中的矢量动画,先理解一下关于 SVG 的相关知识还是很有必要的: 可以点击 SVG 讲解 或 Wik ...

  5. android+桌面文件夹动画,Android动画

    1.为什么要说动画? 动画的适用是Android开发常用的知识 种类繁多,适用复杂,很多实现需要自定义动画 2.目前Android中有多少种动画? 视图动画(View 动画) 属性动画 揭露动画(Re ...

  6. android呼吸灯动画,Android高德地图自定义定位蓝点实现呼吸灯功能

    还是先上个图吧: cluster.gif 说下实现的原理,首先这个定位小蓝点是由两张图片组成的,最底层的一张白色圆形图片以及上一层的蓝色圆形图片,只要不停的对蓝色图片进行透明度动画操作就可以实现这个效 ...

  7. android 图片查看动画,Android 共享动画实现点击列表图片跳转查看大图页面

    主要内容使用系统提供的 API 实现共享动画 在实现过程中遇到的问题图片点击和关闭之后会出现短暂的黑屏问题实现的动画效果如下: 共享动画.gif 具体实现这个效果是在两个页面之间的切换动画,既然是两个 ...

  8. Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...

  9. android 上下扫描动画,Android扫描雷达动画

    很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...

  10. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

最新文章

  1. 【原】移动端界面的适配
  2. 【UOJ 92】有向图的强连通分量
  3. 真正拿大厂offer的人,都赢在这一点
  4. 做系统ghost步骤图解_掌握这几个步骤电脑小白也会做系统
  5. C++ #define参数问题
  6. php7.2连接mysql8_兼容 php 7.2 及 mysql 8
  7. 优化理论14----二分法、二分法与黄金分割法比较、python实现
  8. LINUX开源监控平台Nagios(主机监控配置)
  9. Kalman算法C++实现代码(编译运行通过)
  10. 程序员英文简历范例(前端)
  11. 解决cmd命令行乱码问题
  12. Apple Pay编程指南
  13. 2021年中国粮食行业发展现状分析,粮食播种面积、产量再度迎来上涨「图」
  14. Windows API ShowWindow和UpdateWindow
  15. 对于阿里云的oss上传本地图片的相关注意点
  16. uploadify的简单使用
  17. arduino测试ArduinoModbus库例程
  18. 利用程序随机构造N个已解答的数独棋盘
  19. 深聊性能测试,从入门到放弃之: Windows系统性能监控(三)任务管理器介绍及使用。
  20. 163.net是什么邮箱?这种个人邮箱你足够了解么?

热门文章

  1. 打开html自动播放音乐,如何使背景音乐在打开网页时就自动播放
  2. 推荐英语学习几本好书
  3. AI工具栏为两栏,工具栏显示不完全
  4. SOLIDWORKS参数化设计方式几多种,你都用恰当了吗?
  5. 清华本科生0人去阿里,交叉信息院硕士没人再深造 | 清华大学2020年毕业生就业质量报告...
  6. 文献html阅读器,强烈推荐文献阅读器CAJviewer——大学生阅读文献、论文必备工具!!!...
  7. 基于FBX SDK的FBX模型解析与加载 -(二)
  8. 断网重启路由器就好_为什么总是断网重启路由器就好了
  9. Python数据分析-绘图-2-Seaborn进阶绘图-7-网格图
  10. 史丰收速算 (蓝桥杯)