Android高级进阶Android开发经验谈

Android中的动画--笔记

2016-03-08  本文已影响362人  Kevin_Curry

android中的动画分 View Animation和Property Animation两大类

View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);

Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;

Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

Property Animation  包括ValueAnimator和ObjectAnimator

Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。

属性动画是怎么实现的?

属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等

为什么要有属性动画?

Property Animator能实现补间动画无法实现的功能

View Animation仅能对指定的控件做动画,而Property Animator是通过改变控件某一属性值来做动画的。

补间动画虽能对控件做动画,但并没有改变控件内部的属性值。而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的

View Animation和PropertyAnimation有什么不同?

1、引入时间不同:View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才开始有Property        Animation相关的API。

2、所在包名不同:View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。

3、动画类的命名不同:View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator

Tween Animation有四种形式:

l  alpha              渐变透明度动画效果

l  scale               渐变尺寸伸缩动画效果

l  translate         画面位置移动动画效果

l  rotate              画面旋转动画效果

使用方法

Tween动画的实现原理

通过view的matrix和alpha变量对view进行修改,但是并不会修改view自身属性。

Frame Animation

Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package,Android SDK提供了另外一个类AnimationDrawable来定义使用Frame Animation。

这里有点不同的是,利用AnimationDrawable实现动画时,本身并没有提供接口来监听动画的状态(开始,结束),需要自己处理。

Property Animation  包括ValueAnimator和ObjectAnimator;

ValueAnimator和ObjectAnimator有什么不同?

ValueAnimator只不过是对值进行了一个平滑的动画过渡,而ObjectAnimator就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的

ObjectAnimator  动画的执行类

为了能让动画直接与对应控件相关联,以使我们从监听动画过程中解放出来,谷歌的开发人员在ValueAnimator的基础上,又派生了一个类ObjectAnimator;

ObjectAnimator做动画,并不是根据控件xml中的属性来改变的,而是通过指定属性所对应的set方法来改变的

(1)、setRotationX、setRotationY与setRotation

      setRotationX(float rotationX):表示围绕X轴旋转,rotationX表示旋转度数

      setRotationY(rotationY):表示围绕Y轴旋转,rotationY表示旋转度数

      setRotation(float rotation):表示围绕Z旋转,rotation表示旋转度数

(2)、setTranslationX与setTranslationY 

    setTranslationX(float translationX) :表示在X轴上的平移距离,以当前控件为原点,向右为正方向,参数translationX表示移动的距离。

    setTranslationY(float translationY) :表示在Y轴上的平移距离,以当前控件为原点,向下为正方向,参数translationY表示移动的距离。

(3)、setScaleX与setScaleY

  setScaleX(float scaleX):在X轴上缩放,scaleX表示缩放倍数

  setScaleY(float scaleY):在Y轴上缩放,scaleY表示缩放倍数

ObjectAnimator

ValueAnimator 动画的执行类

这个Animation是针对值的!ValueAnimator不会对控件做任何操作 我们可以给它设定从哪个值运动到哪个值,通过监听这些值的渐变过程来自己操作控件。以前我们曾讲过Scroller类,Scroller类也是不会对控件操作的,也是通过给他设定滚动值和时长,它会自己计算滚动过程,然后我们需要监听它的动画过程来自己操作控件,ValueAnimator的原理与Scroller类相似 

第一步:创建ValueAnimator实例

创建实例

ValueAnimator.ofInt创建了一个值从0到400的动画,动画时长是1s

第二步:添加监听

AnimatorListener

AnimatorListener中,主要是监听Animation的四个状态,start、end、cancel、repeat;当动画开始时,会调用onAnimationStart(Animator animation)方法,当动画结束时调用onAnimationEnd(Animator animation),当动画取消时,调用onAnimationCancel(Animator animation)函数,当动画重复时,会调用onAnimationRepeat(Animator animation)函数。

AnimatorUpdateListener

监听动画的实时变化状态

三、移除监听

针对AnimatorUpdateListener和AnimatorListener,每个监听器都有两个方法来移除

PropertyValuesHolder与Keyframe

ValueAnimator和ObjectAnimator除了通过ofInt(),ofFloat(),ofObject()创建实例外,还都有一个ofPropertyValuesHolder()方法来创建实例

PropertyValuesHolder 这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值

AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。

插值器

插值器,也叫加速器 是用来控制动画区间的值被如何计算出来的Interpolator 属性是Animation类的一个XML属性 所以alpha、scale、rotate、translate、set都会继承得到这个属性。Interpolator被译为插值器 其实他是一个指定动画如何变化的东东,跟PS里的动作有点类似

Evaluator  就是将从加速器返回的数字进度转成对应的数字值。

Evaluator    其实就是一个转换器,他能把小数进度转换成对应的数值位置

二、scale标签 缩放(从控件中心点,从0放大到1.4倍,保持结束时的状态)

三、rotate标签 旋转(从控件中心点,从0放大到1.4倍,保持结束时的状态)

四、alpha标签 (将透明度从0变成1.0) 

五、translate标签 位移(把控件从(0,0)平移到(-200,-200)的位置,保持结束时状态不变)

Animation类是所有动画(scale、alpha、translate、rotate)的基类,

ScaleAnimation 缩放

AlphaAnimation 透明度

RotateAnimation 旋转

TranslateAnimation 位移

AnimationSet 定义动作类的集合 它是没有XML属性的

同样效果的JAVA代码

alphaAnim =newAlphaAnimation(1.0f,0.1f);

scaleAnim =newScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);

rotateAnim =newRotateAnimation(0,720, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);

setAnim=newAnimationSet(true);

setAnim.addAnimation(alphaAnim);

setAnim.addAnimation(scaleAnim);

setAnim.addAnimation(rotateAnim);

setAnim.setDuration(3000);

setAnim.setFillAfter(true);

AnimatorInflater 用户加载属性动画的xml文件

TypeEvaluator  类型估值,主要用于设置动画操作属性的值。

TimeInterpolator 时间插值,上面已经介绍。

上一篇下一篇

猜你喜欢

热点阅读