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

本文介绍了如何在Android中利用animator实现粒子动画,特别是粒子的放大效果。通过讲解Shader的使用,如LinearGradient,以及animator的原理和用法,包括设置动画时长、插值器、监听器等。此外,还展示了如何通过ValueAnimator结合自定义的TypeEvaluator来控制粒子的位置和大小变化,最后通过一个实例展示了如何创建一个可缩放的粒子效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

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

自定义View的基本知识。

2、着色器

为了让效果的色彩比较的绚丽,需要让粒子(这里其实就是用小圆点代替)有一个色彩的过渡,所以需要用到着色器。比较常用到的主要有线性渐变的着色器,它可以让粒子整体上看上去具有一个按照线性排列的色彩过渡。了解线性渐变的着色器之前,先了解shader。在paint里面有一个setshader方法,用于设置着色器,着色器的作用就是用于给颜色实现一个跨度的平衡感,如果paint里面包含了shader对象,那么用此paint绘画的线,圆圈,图像之类的图案,都会从shader里面获取颜色,因此,它是实现绚丽色彩的基础。

2.1LinearGradient

笔者更倾向与叫它线性画笔,它是shader的子类,他实现的颜色平衡感是通过线性渐变来实现的。使用它,很简单,只需要知道它的构造函数就行。

public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,

TileMode tile)

其中x0表示起始点x坐标,x1表示终止点x坐标,color0是起始颜色,color1是终止颜色,tile是平铺模式,它主要有三个值分别是TileMode.CLAMP,TileMode.REPEAT,TileMode.MIRROR。分表表示复制模式,重复模式,镜像模式。假如有如下代码:

LinearGradient linearGradient=new LinearGradient(0,0,canvas.getWidth(),canvas.getHeight(), Color.RED,Color.BLUE, Shader.TileMode.REPEAT);

Paint paint=new Paint();

paint.setShader(linearGradient);

canvas.drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,canvas.getWidth()/2,paint);

那么它的效果如下:

可以看到线性渐变画笔可以让颜色有一个过渡,这种感觉是很美妙的。如果我们再加一些动画,一些透明度变化,就可以做出很绚丽的色彩效果了。

3.animator

animator是android3.0之后提供的特性,在这之前使用的是animation,区别在于,前者是可以真正改变属性值的,后者只是改变了视图的位置,但是视图的属性并没有得到任何改变,类型障眼法。animator是一个抽象类,是valueAnimator,objectAnimator等的父类,它主要鉴定了一些属性动画的基本操作,比如启动,暂停设置动画监听器等等。

启动动画:

public void start()

public void end()

上述方法分别用于启动动画和终止动画,start方法由哪个线程启动则运行在哪个线程,end方法则用于终止动画的运行,它会让动画停止并且迅速到结尾的值(属性动画一般会有插值器,默认的是先加速后减速的插值器,用于从一个初始值到结尾制的过渡)。

暂停,继续动画:

public void pause()

public void resume()

pause用于暂停动画,如果动画尚未start,或者已经end,则此调用会被忽略。注意此方法必须和start同一线程被调用。如果要继续动画,则调用resume方法。

设置动画时长:

public abstract Animator setDuration(long duration)

用于给动画从开始到结束设置一个时间长度,单位是毫秒。

设置时间插值器:

public abstract void setInterpolator(TimeInterpolator value);

此方法可以设置时间插值器,它的作用是,可以让动画不处于线性变化的效果,默认的话是先加速后减速的插值器。即动画效果从起始值到终止值得过渡,会经历一个加速减速的过程。

设置监听器:

public void addListener(AnimatorListener listener)

如果希望监听动画是否完成结束或者重复的动作,就可以设置一个动画监听器。animatorListener的原型如下:

3.1 animatorListener

public static interface AnimatorListener {

void onAnimationStart(Animator animation);

void onAnimationEnd(Animator animation);

void onAnimationCancel(Animator animation);

void onAnimationRepeat(Animator animation);

}

当调用start时候,onAnimationStart就会被回调,当end被调用的时候,onAnimationEnd被回调。当调用cancel停止动画的时候,onAnimatonCancel被回调。

以上是animator的基本要点。有了这些基本知识,现在就可以学习ValueAnimator了。

4.valueAnimator

valueAnimator是一个值动画,怎么理解呢?它的作用在于,能够把你设置的初始值,和终止值作为起始点,然后通过插值器,在一段时间内,按照插值器的的计算来设置当前动画的值,因为这些值一般都会影响动画的效果,所以叫做值动画。对于插值器,可能大家比较模糊,插值器主要是用来加速度来改变值的,比如:

AccelerateDecelerateInterpolator

public float getInterpolation(float input) {

return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

}

这是一个先加速后减速的插值器,它的计算过程是通过getInterpolation来计算返回值的。再细心一点,大家可以研究一下cos函数的数值变化,就知道为什么是先加速后减速了。

4.1常用的初始化valueAnimator的方法

既然valueAnimator是值动画,那么自然包含可以设置值的方法,valueAnimator对一些常用的数值类型提供了支持。比如:

public static ValueAnimator ofInt(int... values)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值