Android补间动画Tween Animation使用解析

简介

Android系统动画到现在应该有三个阶段了,第一个阶段就是View Animation,重点介绍了两种动画Tween Animation和Frame Animation,
第二个阶段是Android3.0之后提供的Property Animation,当然了如果想在3.0之前的版本使用Property Animation可以导入第三方的NineOldAndroids
jar包,使用第三方动画库也非常方面,因为它与google官方的api相似度很高。第三个阶段是在Android4.4版本推出之后,在该版本上推出了Scene和Transition用于创建更为丰富、
复杂的动画,特别是在Android Material Designer中使用了大量该种动画。

本文重点介绍View Animation中的第一种动画Tween Animation补间动画,View Animation是最简单的一种动画,由名称可以知道它的缺点,该动画仅仅可以作用于View,而且只支持一部分属性,如支持缩放旋转平移透明度变化但是不支持背景颜色的改变。

而且对于View Animation,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如,你有一个Button,坐标(100,100),Width:200,Height:50,而你有一个动画使其变为Width:100,Height:100,你会发现动画过程中触发按钮点击的区域仍是(100,100)-(300,150)。

Tween Animation

Tween Animation补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。

Tween Animation就是一系列View形状的变换,如大小的缩放,透明度的改变,位置的改变,View的旋转,动画的定义既可以用代码定义也可以用XML定义,当然建议用XML定义。
可以给一个View同时设置多个动画,比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。

用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以为<alpha>,<scale>,<translate>,<rotate>,interpolator元素或(表示以上几个动画的集合,set可以嵌套)。默认情况下,所有动画是同时进行的,可以通过startOffset属性设置各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。

Tween Animation主要包含了四种动画ScaleAnimation、TranslateAnimation、RotateAnimation、AlphaAnimation,四种动画分别作用于View的缩放、平移、旋转和透明度,接下来分别对着四种动画介绍。

animation

ScaleAnimation

ScaleAnimation用于控制View的缩放。

讲解动画之前先把View布局贴出来,布局很简单就是一个按钮和一张图片:

在/res/anim目录下新建一个动画文件scale_animate01.xml,文件内容如下:

在动画文件中有两个属性需要注意一下,android:pivotX和android:pivotY,这两个属性控制动画执行时的轴心,缩放动画就是告诉我们要以什么为中心进行缩放。在xml文件中事实上三种不同的表现方式。

  • 50%相对于View自身,就是相对于自己的中心点
  • 50%p相对于父View的中心点。
  • 50事实上就是表示50px,相对于屏幕左上角。

Tween Animation前面我们说了要给出两个关键帧:

事实上就是开始时的状态和结束时的状态,android:fromXScale="0.0"表示缩放X方向大小至0,表示动画开始帧看不到图像了,android:toXScale="1.0"表示缩放X方向1.0状态,表示动画结束帧动画还原至原大小,动画执行的时间用的是android:duration表示的,android:fillAfter表示动画执行完成后与否要保持现有最后一帧状态,这里设置为true,则保留动画执行后最后一帧的状态。android:interpolator动画插值器,将来想另起一篇专门介绍一下,该动画使用的插值器表示先加速然后减速执行动画,本文暂不做过多的介绍了。
在代码中如何来加载我们已经定义好的动画呢,Android提供了一个工具类AnimationUtils,代码如下:

scaleanimation

在代码中如何来构建与xml中一样的动画呢,事实上也很简单,就是通过构造函数或者set属性将动画的各个属性设置进去即可。

TranslateAnimation

TranslateAnimation视图平移动画。

在代码中实现如下:

translateanimation

RotateAnimation,AlphaAnimation简单的代码实现这里就不再贴出来了,可以下载示例源代码查看。

AnimationSet

动画集合,就是说可以包含多个Tween Animation,其中的动画可以同时执行,也可以分步执行。

在动画集合中有一个新的属性android:shareInterpolator,如果设置为true,就表示在set中的所有动画都使用同一个动画插值器Interpolator,当然了如果设置为false,可以为每个动画设置不同的动画插值器Interpolator。

上述xml中动画代码实现如下:

在使用xml配置动画时,我们可以在set中设置动画相关属性android:fillAfterandroid:duration,然而在每一个动画中也可以单独设置,在这种情况下到底哪一种会起作用呢,简单的实验一下,在Android2.3版本中,在set总设置android:fillAfter有效,而设置android:duration无效,但是在Android4.4版本set中设置android:duration则有效,而android:fillAfter在动画集合中为每一中动画分别设置android:fillAfter都无效,无论Android2.3还是Android4.4中,也就是说,如果在开发中需要设置android:fillAfter,我们在set直接设置即可,但是在设置动画自定义时间时android:duration需要注意一下Android版本。
如果在代码中实现动画集合,对于动画执行时间duration的设置,我们可以不必担心版本问题可以直接在AnimationSet设置动画执行时间。

animationset

设置动画延时时间

设置动画延时时间是通过startOffset实现的,该属性在动画集合中也相当有用,我们可以执行完一个动画后再执行其他动画。

加入了startOffset,我们就可以在动画集合中实现序列动画了,一个动画接着一个动画的执行,效果图如下:

animationset02

小结

马上就要过年了,今年最后一篇博客,来年继续。在家里闲逛了一下,感觉总不能除了搓麻将就是斗地主吧,The Last,最后一篇。Android动画还有很多内容,今天只是简单介绍了一部分,年后再继续,大致罗列一下接下来动画部分:帧动画Frame Animation,属性动画Property Animation,动画插值器Interpolator,Android4.4之后的Scene和Transition,当然了这些都是动画的基础知识点,在学习记录过程中或许会再添加部分常见动画案例或特效,通过上面一系列的文章希望可以对动画有一个系统化的理解,由于个人能力有限,相信在学习过程中难免会出现错误之处,如若发现错误疏漏之处还望不吝赐教,多多交流以求共同进步!

最后了,一篇“年终尾记”也没什么特殊之处,新年快乐!

本文地址:www.sunnyang.com/372.html

示例源代码下载

参考资料

Android动画学习笔记-Android Animation

Android Animations Tutorial 1: Introduction

Android Animations Tutorial 2: View Animations Overview

使用Android.Transition框架创建动画(1)

One comment

发表评论