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

原创 2016年05月31日 11:32:49
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类里面定义了 补间动画 所要用到的大部分方法,并且是所有补间动画类的父类。
    该类的继承关系:

    该类方法:
        构造方法: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、高度50dp,此时父控件宽度是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开发之Tween(补间动画)完全解析(上)——xml文件配置的实现

相信不管做了多长时间开发的人都用用过Tween动画,从刚开始工作到现在我也是用了N次Tween动画,但是每一次使用总感觉掌握的不够全面,所以花了点时间详细的总结了下Tween动画,其实在android...
  • dmk877
  • dmk877
  • 2016年07月22日 23:27
  • 5899

Android 动画系列之补间(Tween)动画详解

上一篇博客中写了逐帧动画(Frame)的使用,Android中除了支持逐帧动画(Frame)之外,也提供了对补间(Tween)动画的支持。补间动画就是指开发者只需要指定动画的开始、结束等“关键帧”,而...
  • Airsaid
  • Airsaid
  • 2016年06月05日 20:34
  • 9630

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

本节我们来讲补间动画补间动画的实现方式,补间动画则是通过特定算法在两个关键帧之间补充渐变的动画效果来实现的。补间动画的优点是可以节省空间。...
  • qwer4755552
  • qwer4755552
  • 2016年08月28日 15:54
  • 266

Android动画(一):View动画(补间动画)

一、动画的简单介绍: 在Android项目的开发过程中,如果某些控件或者界面突然的出现或者消失,会造成分厂差的用户体验。所以我们需要为特定的控件或者界面添加一些动画效果.二、分类:View动画(补间...
  • Afanbaby
  • Afanbaby
  • 2016年08月07日 10:00
  • 2030

Android 连续的补间动画(Animation/Tween)

通过Animation监听事件实现连续动画创建一个简单的xml文件,里面有一个< imageview>即可MainActivity.java:public class MainActivity ext...
  • zhengyikuangge
  • zhengyikuangge
  • 2016年03月17日 14:02
  • 618

android动画_补间动画_xml方式

一、项目目录结构 二、activity_main.xml界面 三、activity_main.xml代码
  • songyi160
  • songyi160
  • 2017年01月01日 22:54
  • 316

Android开发之Tween(补间动画)完全解析(下)——代码实现

在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,这...
  • dmk877
  • dmk877
  • 2016年07月24日 20:30
  • 1941

Android 补间动画原理

这段时间项目中用到了动画,所以趁热打铁,看看动画原理 补间动画 使用举例 TranslateAnimation translateAnim = new TranslateAnimation(0, 1...
  • Mr_LiaBill
  • Mr_LiaBill
  • 2015年10月30日 13:53
  • 2223

android补间动画(TweenAnimation)

一、AlphaAnimation(渐变动画) //渐变动画 private void startAlphaAnimation () { /** * 创建渐变动画对象 * ...
  • yangshuangyue
  • yangshuangyue
  • 2016年09月20日 00:29
  • 155

【Android开发】动画范例2-旋转、平移、缩放和透明度渐变的补间动画

实现旋转、平移、缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转、平移、缩放和透明度渐变的动画资源文件。 透明度渐变的...
  • u013517797
  • u013517797
  • 2015年05月19日 20:48
  • 1988
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android动画1-补间动画(TweenAnimation)
举报原因:
原因补充:

(最多只允许输入30个字)