笔记 :

Android 中的三类动画:Frame Animation(逐帧动画),Tween Animation(补间动画),Property Animatior(属性动画)。
Frame Animation :逐帧动画就是通过播放预先排序好的图片来实现动态的画面。
Tween Animation :补间动画是对某个View进行一系列的动画操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate) 四种模式。
Property Animatior:属性动画是Android3.0之后引进的,它更改的是动画的实际属性,在Tween Animation(补间动画)中,其改变的是View的绘制效果,真正的View的属性是改变不了的,比如你将你的Button位置移动之后你再次点击Button是没有任何点击效果的,或者是你如何缩放你的Button大小,缩放后的有效的点击区域还是只有你当初初始的Button的大小的点击区域,其位置和大小的属性并没有改变。而在Property Animator(属性动画)中,改变的是动画的实际属性,如Button的缩放,Button的位置和大小属性值都会发生改变。而且Property Animation不止可以应用于View,还可以应用于任何对象,Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

最近,工作项目中加入了直播模块业务(忍不住想吐槽了,现在项目加入直播之后,变得庞大笨重,,,呵呵哒了,以后出去跟别人吹牛,我可以一本正经地说:电商、社区和直播 我都做过!!!),大家都知道,直播中就需要大量地动画实现,比如:打赏动画啦,特效啦,等等。所以,我想对Android 的 属性动画(其他俩动画,大家可以自己网上搜搜)做个总结,也算是对自己知识的积累和巩固。

Property Animatior (属性动画官网网址)

相关API概览:

1.Animators: subclasses extend Animator

Class Description
ValueAnimator 属性动画的主要时序引擎,并计算将要进行动画的属性的值。它拥有所有的核心功能,计算动画值,并包含每个动画的时间细节,动画是否重复的信息,接收更新事件的侦听器,以及可以计算设置的自定义类型。动画属性有两部分:计算动画值并将值设定到正在动画的对象的属性上。ValueAnimator不进行管理第二部分,所以你必须监听ValueAnimator计算出的值,并按自己的逻辑更新和修改的动画对象(把动画值设置到动画对象属性上)。
ObjectAnimator ValueAnimator的基类,允许你设定一个目标对象和对象属性的动画。当它为动画计算一个新值时,该类相应地更新属性。大部分时间你想用objectanimator,因为它使设置动画值到目标对象的过程更容易。然而,有时你想直接使用ValueAnimator,因为ObjectAnimator有较多一点的限制,如要求目标对象中存在特定的acessor方法。
AnimatorSet 动画集合,提供一种机制,使组动画一起运行,以便它们相互运行。您可以设置动画一起播放,顺序播放,或在指定的延迟后播放。

2.Evaluators 求值器:属性动画系统如何计算属性值

Class Description
IntEvaluator 整数型求值器
FloatEvaluator 浮点型求值器
ArgbEvaluator 颜色求值器
TypeEvaluator 一个接口,允许你创建自己的计算器。如果你执行动画的对象属性不是int,float,或颜色,你必须实现的TypeEvaluator接口指定如何计算对象属性值的动画。你也可以自定义一个 TypeEvaluator 为 int,浮动,和颜色的类型,来实现这些类型不同的默认行为。

3.Interpolators 插值器,按某种方式计算某一时间下的动画值。

Class Description
AccelerateDecelerateInterpolator 变化率开始和结束缓慢而加速通过中间
AccelerateInterpolator 变化率开始缓慢,然后加快
AnticipateInterpolator 开始时先后退点,然后向前
AnticipateOvershootInterpolator 其变化开始时落后,甩向前和过冲的目标值,然后最终返回到最终值。
BounceInterpolator 其改变跳动在末端。
CycleInterpolator 动画将重复周期的指定数目。
DecelerateInterpolator 变化率开始时快,然后再减慢。
LinearInterpolator 速度是恒定
OvershootInterpolator 甩向前和过冲的目标值,然后最终返回到最终值。
TimeInterpolator 接口,允许定义自己的插值器

Animating with ValueAnimator

  // ofInt() , onFloat() , ofObject()  //  start() 后,就会计算 1000毫秒内,从 0 到  1时 ,各时间的动画值  ValueAnimator animation = ValueAnimator.ofFloat(0f,1f);  animation.setDuration(1000);  animation.start();  //自定义一个 求值器。  ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);  animation.setDuration(2000);  animation.start();

当然,以上直接运行时不会产生动画效果的,因为ValueAnimator 需要手动指定目标动画对象属性的。我们添加如下代码:

  //监听 animation 的动画值的变化,并改变 View 的属性值  animation.addUpdateListener(new AnimatorUpdateListener()    {         @Override        public void onAnimationUpdate(ValueAnimator animation)        {             // 改变 mView(比如:ImageView,TextView等) 的透明度           mView.setAlpha((Float) animation.getAnimatedValue());        }    });  

Animating with ObjectAnimator

  ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(animView,"alpha",1f,0f,1f);  objectAnimator.setDuration(2000);  objectAnimator.start();

实现如同 ValueAnimator 的效果,发下代码少了不少。不过,ValueAnimator灵活性高些。
提示
1.ObjectAnimator 设置对应的动画属性时,如果该属性在target(动画目标对象)中不存在,我们则需要自己定义该属性相对应的setter方法,然后去执行 invalidate()属性动画目标对象呈现动画。
2.当只设置一个属性值(如下)时,默认是结束的动画值。且当是自定义的属性时,我们要提供一个属性值的同类型的setter和getter方法,如下则 都是 float 型

ObjectAnimator.ofFloat(animView,"alpha",1f);

Choreographing Multiple Animations with AnimatorSet

动画集合通过对多个动画的执行顺序进行排列实现更加酷炫的动画效果。如下实现图片的同时缩放和淡出淡入,并随后360度翻转。

//实现 同时透明和缩放 ,随后360翻转AnimatorSet animatorSet = new AnimatorSet();ObjectAnimator objectAnimator1 =ObjectAnimator.ofFloat(animView,"alpha",1f,0f,1f);objectAnimator1.setDuration(2000);ObjectAnimator objectAnimator2 =ObjectAnimator.ofFloat(animView,"scaleX",1f,0f,1f);objectAnimator2.setDuration(2000);ObjectAnimator objectAnimator3 =ObjectAnimator.ofFloat(animView,"scaleY",1f,0f,1f);objectAnimator3.setDuration(2000);ObjectAnimator objectAnimator4 = ObjectAnimator.ofFloat(animView,"rotationX",0f,360f);objectAnimator4.setDuration(2000);animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3);animatorSet.play(objectAnimator4).after(objectAnimator1);animatorSet.start();

AnimatorSet 提供了 play()执行方法 和 before(),after(),with()的组合方式。

Animation Listeners

动画的监听: 开始,结束,重复,取消

Animator.AnimatorListener

  • onAnimationStart() - Called when the animation starts.
  • onAnimationEnd() - Called when the animation ends.
  • onAnimationRepeat() - Called when the animation repeats itself.
  • onAnimationCancel() - Called when the animation is canceled. A cancelled animation also calls onAnimationEnd(), regardless of how they were ended.

ValueAnimator.AnimatorUpdateListener

  • onAnimationUpdate()
    called on every frame of the animation. Listen to this event to use the calculated values generated by ValueAnimator during an animation. To use the value, query the ValueAnimator object passed into the event to get the current animated value with thegetAnimatedValue() method. Implementing this listener is required if you use ValueAnimator

如果,你只需要监听 end 方法的话,可以这样调用 AnimatorListenerAdapter

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);fadeAnim.setDuration(250);fadeAnim.addListener(new AnimatorListenerAdapter() {    public void onAnimationEnd(Animator animation) {          balls.remove(((ObjectAnimator)animation).getTarget());    }}

动画效果我下回上传。

由于Property Animator 知识点太多,这篇文章就先写到这里,算是对属性动画的一个初步认识和使用的介绍。随后,我会添加上 Evaluator,Interpolator , xml文件创建属性动画 和 布局动画的介绍。fighting!!!

源码,源码中还有我之前写的防直播打赏礼物动画效果。欢迎大家指教!

更多相关文章

  1. React Native常用一些组件
  2. Android(安卓)SensorService源码分析(二)
  3. Android从服务器端接收json数据并解析的代码
  4. 彩信对象android(5)_发彩信操作
  5. android 组件隐蔽显示状态
  6. android中LayoutAnimationController类的使用
  7. 《Kotlin》 Kotlin Android(安卓)Extensions (译文)
  8. Android(安卓)自定义View (一)
  9. Android常用三方框架

随机推荐

  1. Android SDK 1-23各版本代号和别名
  2. TCPDUMP抓取android手机流量包+wireshark
  3. Android 最终image文件的来源
  4. Android的问题与解决
  5. 去掉WebView中的白色背景
  6. Android(java)学习笔记115:Android(安卓)Inp
  7. 【Android】Android(安卓)手机连接 Win7
  8. 删除Android Studio中的工作空间(project)
  9. Android 开发中涉及到的设计模式
  10. Eclipse开发简易的Android服务器