热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android矢量粒子动画,Android碎裂的粒子效果

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

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

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

1af53020719f

粒子破碎效果

依惯例,先说下行文思路吧,首先我们先简单分析下效果,拆分关注点,粒子效果是怎么产生的?我的解决方案就是先获取当前要碎裂的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

for (int column = 0; 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<&#61;0)

radius &#61; 0;

alpha &#61; 1f - factor;

}

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

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

particleAnimator.setOnAnimationListener(new ParticleView.OnAnimationListener() {

&#64;Override

public void onAnimationStart(View view,Animator animation) {

//动画开始

view.setVisibility(View.INVISIBLE);

}

&#64;Override

public void onAnimationEnd(View view,Animator animation) {

//动画结束

}

});

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

&#64;Override

public void onClick(View v) {

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

}

});



推荐阅读
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
author-avatar
mobiledu2502926503
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有