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、高度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上文说的东西。想要实现不止一种动画,就多写几个动画标签就可以了。