Android动画1-补间动画(TweenAnimation)

Android的动画形式共有三种:TweenAnimation(补间动画)、FrameAnimation(帧动画)、PropertyAnimation(属性动画)。
本章介绍补间动画。

先说个题外话: 帧动画的帧是什么?  一个静止的画面就是一帧,简单来说,一幅画就是一帧,一幅图片就是一帧(动态图除外),View类里面的onDraw方法每运行一次就绘制一帧。实际上 所有的你看起来能动的东西(滑动,动画,视频等)都是由很多静态图按照一定顺序和一定速度切换形成“动起来“的一种错觉,而图片越多、切换速度越快就会使动作更加平滑。有一个概念经常听到:FPS。玩大型游戏的时候经常会看FPS值,这个FPS(Frame Per Second)就是每秒绘制的帧数,那么 一般来说FPS越大也就是每秒绘制的图片更多,那么 画面质量就肯定越高。目前基本上电影的FPS(通常不这么叫)是24,也就是24帧每秒(想想一个2小时的电影有多少帧......)。

进入正题: 补间动画就是代码里面确定首帧和末帧这两个关键帧,其中间的帧由电脑计算得出。补间动画的补间就是补这个中间的帧。

本文结构:
    1. Animation类
    2. 四种补间动画
    3. Interpolator(插值器)的使用
    4. AnimationSet(动画集合)的使用
 


一 Animation类
    Animation类里面定义了 补间动画 所要用到的大部分方法,并且是所有补间动画类的父类。
    该类的继承关系:
Android动画1-补间动画(TweenAnimation)_第1张图片
    该类方法:
        构造方法:1. 无参构造。
                          2. Animaiton(Context context, AttributeSet attrs);
        常用方法:
                ⑴ getDuration()
                        获得动画的执行时长
                ⑵ getFillAfter()
                        获得动画结束时的状态值
                ⑶ getFillBefore()
                        获得动画结束时的状态值
                ⑷ getInterpolator()
                        获得所使用的插值器      
                ⑸ getRepeatCount()
                        获得动画重复次数
                ⑹ getRepeatMode()
                        获得动画重复模式
                ⑺ getStartOffset()
                        获得动画延迟的时间
                ⑻  isInitialized()
                        动画是否已经初始化--true-已经初始化
                ⑼  setAnimationListener()
                        设置监听器,可以监听动画开始、结束、重复三个状态
                ⑽  void setDuration(long durationMills)
                        设置动画持续时长,单位为毫秒,小于0会出 非法参数异常
                ⑾  void setFillAfter(boolean fillafter)
                        设置动画结束时的状态值。 true--动画结束后停留在最后一帧(注:没有改变view的属性)
                ⑿ void setFillBefore(boolean fillbefore)
                        设置动画结束时的状态值。 true--动画结束后停留在第一帧(注:没有改变view的属性)  (注: 如果FillAfter和FillBefore都为true,执行FillAfter, 如果两者都为false,则动画结束后停留在第一帧
                ⒀  void setInterpolator(Interpolator i);  设置插值器。插值器决定动画执行速度的变化曲线
                     void setInterpolator(Context context, int resId);  从XML中获取插值器
                ⒁  void setRepeatCount(int count)
                     设置动画重复次数   设置0为不重复,1为重复1次......  
                ⒂  void setRepeatMode(int mode)
                     设置动画重复模式    Animation类常量,Animation.RESTART-从动画起始位置再重复动画一次      Animation.REVERSE-从当前动画结束位置倒着重复一次
                ⒃  void setStartOffset(long mills)
                     设置动画启动的延迟时间,单位是毫秒值。 (注:如果设置了动画重复,那么每次重复的时候也要先经过这个延迟的时间)
                ⒄  cancel() 
                     取消动画,如果调用该方法的时候动画正在进行,则动画还原初始状态
    
     
     补充1:动画的使用,使用view.startAnimation(Animation anim)/view.setAnimation(Animation anim)任意一个方法即可开始动画,推荐使用startAnimation。
       补充2:动画监听器说明,动画监听器提供三个方法:onAnimationStart(Animation anim)-监听动画开始时,onAnimationEnd(Animation anim)-监听动画结束时,onAnimationRepeat(Animation anim)-监听动画重复时。    


二 四种补间动画:四种动画类自身方法非常少,主要是靠自身构造方法和Animation类的方法对动画参数进行设置。
    补间动画共有四种形式,Translate(平移)、Scale(缩放)、Alpha(透明度)、Rotate(旋转)。
     1. TranslateAnimation(平移动画)
        在xy平面上移动。
         构造方法
            1. TranslateAnimation(Context context, AttributeSet attrs);
            2. TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
            3. TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue);
            第一个方法基本不使用,主要介绍后两种方法。
            第二种方法: 前两个参数是X坐标的起始位置,后两个参数是Y坐标的起始位置。 (注:这里的起点和终点位置全是绝对坐标,原点(0,0)是屏幕左上角)
            第三种方法:这种方法的2,4,6,8,参数是X和Y坐标的起始位置。 1,3,5,7参数是2,4,6,8参数对应的模式----Animation类中共定义了三种模式,Animation.ABSOLUTE(绝对坐标,效果和第二种方法一样),Animation.RELATIVE_TO_SELF(相对自身,此时X坐标的值为“1f”代表自身宽度,“2f”代表自身宽度的2倍,同理,Y轴就是高度。),Animation.RELATIVE_TO_PARENT(相对父控件,此时X坐标的值为 1f,代表父控件宽度, 2f 代表父控件宽度的2倍,同理,Y轴就是高度。)
            举个例子: 
            一个view宽度是100dp、高度50 dp,此时父控件宽度是200dp、高度是400dp。
           
            这样代表X轴向右平移自身宽度1倍距离,即100dp,Y轴向下平移父控件高度1倍距离,即400dp。
        2. ScaleAnimation(缩放动画)
         放大或缩小。
         构造方法:
            1. ScaleAnimation(Context context, AttributeSet attrs);
            2. ScaleAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
            3. ScaleAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta, float pivotX, float pivotY);
            4. ScaleAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta, float pivotXType, float pivotXValue, float pivotYType, float pivotYValur);
            第一个方法基本不常用,主要介绍后几种方法。
            第二种方法: 前两个参数是X轴方向的放大或缩小比例,后两个参数是Y轴方向的放大或缩小比例。 (注:这里 1f 就代表自身宽(高))
            第三种方法: 前四个参数同上,后两个参数表示缩放中心点的位置(绝对坐标,单位为px)
            第四种方法: 前四个参数同上,后四个参数确定缩放中心坐标,使用参考平移动画。
       3. AlphaAnimation(透明度动画)
         改变透明度。
         构造方法:
            1. AlphaAnimation(Context context, AttributeSet attrs);
            2. AlphaAnimation(float fromAlpha, float toAlpha);
            第一种方法不常用。
            第二种方法: 第一个参数是动画开始时view的透明度,第二个参数是动画结束时view的透明度。 (注: 透明度范围是0~100%,即0~1)
       4. RotateAnimation(旋转动画)
         绕某中心旋转一定角度。
         构造方法:
            1. RotateAnimation(Context context, AttributeSet attrs);
            2. RotateAnimation(float fromDegress, float toDegress);
            3. RotateAnimation(float fromDegress, float toDegress, float pivotX, flota pivotY);
            4. RotateAnimation(float  fromDegress, float toDegress, float pivotXType,  float pivotXValue, float pivotYType, flota pivotYValue);
            第一种方法不常用,主要介绍后三种方法。
            第二种方法: 第一个参数表示动画开始时view的角度,第二个参数表示动画结束时view的角度
            第三种方法: 前两个参数同上,后两个参数是旋转中心坐标(绝对坐标,单位是px)
            第四种方法: 前两个参数同上,后四个参数确定旋转中心坐标,使用参考平移动画。
        
     补充:补间动画的创建有两种方式,一种是从代码创建,另一种是在xml中创建。xml中创建动画的方法:在res目录下创建文件夹anim(必须是anim),然后在anim中创建xml文件,根节点是<set/>,然后在set节点下选择四种节点<alpha/><rotate/><scale/><translate/>分别对应四种补间动画,然后在相应节点内可以写动画的属性(在set节点下定义fillAfter等属性可以在整个set节点下通用); 在代码中使用AnimationUtils.loadAnimation(Context context, int resId)方法创建出Animation,然后使用view.startAnimation(Animation anim)方法执行动画即可。


三 Interpolator(插值器)的使用
    插值器通过 对动画执行的每个时间点进行 提前/延迟 来达到对动画效果的 加速/减速,通过设置不同的 曲线 来得出负时间/大于1的时间值,使控件按设定的动画轨迹 反方向/正方向 超出改变一点轨迹
     这里只介绍 官方提供的9中插值器,即已有的Interpolator的9个子类。当使用插值器的时候只要创建这几个类的对象,然后调用anim.setInterpolator方法就已经把该插值器添加到动画里了,运行动画就能达到想要的效果。
     9个子类:   AccelerateDecelerateInterpolator  加速减速插值器-开始与结束时速度慢,中间速度快
                        AccelerateInterpolator  加速插值器-开始速度慢,然后一直变快
                        DecelerateInterpolator 减速插值器-开始速度快,然后一直变慢
                        AnticipateInterpolator  向前插值器-先向反方向运动一定距离,然后正方向运动到终点
                        AnticipateOvershootInterpolator  向前向后插值器-先反方向运动一定距离,然后正方向运动到超出一定距离,然后返回终点
                        OvershootInterpolator 向后插值器-到轨迹终点之后再正方向运动一定距离,然后返回终点
                        BounceInterpolator  反弹插值器-类似于一物体从高度掉到地上,会弹起来几下
                        CycleInterpolator   循环插值器-类型于正弦曲线那样来回运动
                        LinearInterpolator  线性插值器-正常速度,默认就是
        详细说明:  (注:所有插值器是对时间进行处理,动画的移动轨迹是没有变化的)
 

四 AnimationSet(动画集合)的使用
    有时候需要超过一种的动画组合使用,这时候就要使用AnimationSet。
     AnimationSet继承自android.view.animation。
     使用方法: new一个AnimationSet对象,调用addAniamtion(Animation anim)方法将动画添加到集合里,然后使用view.startAnimation()方法即可执行动画。
     注意事项:1. 添加到集合的动画不分先后顺序,即在没有单独设置startOffSet(延迟时间)的情况下,所有集合中的动画是同时执行的。
                       2. AnimationSet也可以使用Animation类的set方法给各种属性赋值,并且集合的赋值优先级>集合中的单个动画
     举个例子:   t-平移动画  set-动画集合
        t.setDuration(2000);
        set.setDuration(500);
        此动画只执行500毫秒就结束,但是要注意的是动画是在500毫秒内执行完了,不是只执行了1/4就中断了。

        t.setFillAfter(true);
        set.setFillAfter(false);
        此动画执行完后会返回初始位置,而不是停留在结束位置。

        补充:在动画的xml文件中,根节点<set><set/>本身就是一个动画集合,在里面写的动画符合关于AnimationSet上文说的东西。想要实现不止一种动画,就多写几个动画标签就可以了。





你可能感兴趣的:(android,动画)