Animator 属性动画简单使用

本文详细介绍了Android中的属性动画,包括其工作原理、与补间动画的区别、ValueAnimator与ObjectAnimator的区别及使用场景,同时还探讨了AnimatorSet、Animator监听器、ViewPropertyAnimator等组件的作用。

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

学习资料:
http://blog.youkuaiyun.com/guolin_blog/article/details/43536355
http://blog.youkuaiyun.com/lmj623565791/article/details/38067475#


一:动画分类:

1:补间动画:旋转,平移,渐变,缩放动画
2:帧动画:通过多张图片进行组合形成的播放式动画
3:【android 3.0版本加入】属性动画:可以实现和补间动画一样的效果,但是它实际上是一种不断地对值进行操作的机制, 并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性


二:具体动画的使用场景

1:补间动画,适合控件只是实现动画效果,动画效果不需要涉及的触发相关的事件【click。。。】
2:帧动画:多张图片组成的动画效果
3:属性动画:需要操作对象的属性,也就是动画操作后,动画实际的属性发生了变化,可以响应对应的事件


三:动画之间的区别

1:属性动画和补间动画的区别【补间动画的和属性动画的区别也就是补间它的缺陷所在之处】
《1》补间动画实现的动画,只能对view进行操作,不能对其他对象进行动画操作
比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的。 也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的,这是它的第一个缺陷。
《2》补间动画只能实现移动,缩放、旋转和淡入淡出这四种动画操作,那如果我们希望可以对View的背景色进行动态地改变呢?这个时候就可以通过属性动画,进行再指定时间内进行过度view的颜色属性值,就可实现。
《3》补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性。 比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。
2:ValueAnimatir和ObjectAnimator的区别和关系:
区别--
ValueAnimator并没有在属性上做操作.好处就是:不需要操作的对象的属性一定要有getter和setter方法,你可以自己根据当前动画的计算值,来操作任何属性
ValueAnimatir更灵活,可以自行根据当前动画计算值,来进行操作对象任何属性,也就是通过ValueAnimatir可以动态的自行设置对象的属性。
而ObjectAnimator设置对象的属性更方便,只需要提供属性的get和set方法就可以进行操作,如果属性中的set方法里面没有重新绘制view的方法的话,那么就需要自行进行显示调用。

关系-- 

ObjectAnimator继承ValueAnimator,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,



四:属性动画涉及对象

1:ValueAnimator
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,
我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。
除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
2:ObjectAnimator
因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。
而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
ObjectAnimator在设计的时候就没有针对于View来进行设计,而是针对于任意对象的,它所负责的工作就是不断地向某个对象中的某个属性进行赋值,然后对象根据属性值的改变再来决定如何展现出来 其实ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,那么以alpha属性为例所对应的get和set方法应该就是:
public void setAlpha(float value);
public float getAlpha();
3:AnimatorSet【组合动画】--通过组合形式,进行实现复杂动画
4:Animator监听器  
监听动画的一些状态,开始,结束等。。可以通过Animator类中的addListener方法进行监听。
由于ValueAnimator,ObjectAnimator,AnimatorSet都是间接或直接成为Animator的子类,所以这个方法是全部适用的。
5:ViewPropertyAnimator【3.1习惯中附赠的一个新的功能】:
专门为为View的动画操作提供一种更加便捷的用法,可以通过view的animate方法获取到ViewPropertyAnimator对象,然后进行一连串的连缀方式进行设置
6:TypeEvaluator[类型估值,主要用于设置动画操作属性的值。]--这个对象用于告诉动画系统如何从初始值过度到结束值
该接口当中有一个方法evaluate方法,evaluate()方法当中传入了三个参数,第一个参数fraction非常重要,这个参数用于表示动画的完成度的,我们应该根据它来计算当前动画的值应该是多少,第二第三个参数分别表示动画的初始值和结束值。
那么上述代码的逻辑就比较清晰了,用结束值减去初始值,算出它们之间的差值,然后乘以fraction这个系数,再加上初始值,那么就得到当前动画的值了。
valueAnimatior的ofFloat方法实现的值平滑过度,中间也使用了FloatEvaluator继承TypeEvaluator接口重写evaluate方法的形式。进行计算,当前过度的值

TypeEvaluator的使用场景----在于如果不是对某个值进行过度的话,而是对某个对象进行过度的话,那么系统将完全无法 知道如何从初始对象过度到结束对象,因此我们就需要实现一个自己实现 TypeEvaluator来告知系统如何进行过度,也就是重写TypeEvaluator接口的evaluate方法

 内部原理--其实内部实现尤其简单:  return (int)(startInt + fraction * (endValue - startInt)); 开始值,加上当前的属性改变的百分比*(结束-开始)当然了,这个百分比是fraction ,其实就是TimeInterpolator插值器算出来的。比如线性插值器:fraction 值就是currentTime - mStartTime) / mDuration,动画的运行时间/总设置时间。

7:TimeInterpolator插值器
系统有提供默认的补间器对象,补间器对象也是可以自定义设置到属性动画中的,通过实现TimeInterpolator接口重写getInterpolation方法
8:LayoutTransition
布局动画(Layout Animations)主要使用LayoutTransition为布局的容器设置动画,当容器中的视图层次发生变化时存在过渡的动画效果。
9:propertyValuesHolder
实现一个动画更改多个效果:出了使用animatorSet以外,还可以使用propertyValuesHolder    
public void propertyValuesHolder(View view):
{
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
}


总结

1:使用属性动画时,系统默认的Interpolator其实就是一个先加速后减速的Interpolator,
对应的实现类就是AccelerateDecelerateInterpolator。
2:Interpolator中的BounceInterpolator就是一种可以模拟物理规律,实现反复弹起效果的Interpolator
3:属性动画中自定义Interpolator需要实现TimeInterpolator接口
4:补间动画的缺陷有,只能对view进行操作,不能对对象进行操作。还有一个缺陷是只是改变了view的显示效果而已,而不会真正去改变view的属性。
5:属性动画,实际上是对对象的属性值进行不断的操作,并报值赋值到指定对象的指定属性上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值