概述
本篇博客基于《Android开发艺术探索》,将会介绍以下两种动画:
- 补间动画
- 帧动画
事实上帧动画也是补间动画的一种,但是它们的使用方式略有不同,所以将它们分开介绍。
一、补间动画
补间动画(Tween animation)也叫做View动画,因为它的作用对象是View,它支持平移、缩放、旋转和透明度四种变换效果,它们的具体描述如下表所示:
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移动画 | <translate> | TranslateAnimation | 移动View |
缩放动画 | <scale> | ScaleAnimation | 放大或缩小View |
旋转动画 | <rotate> | RotateAnimation | 旋转View |
透明度动画 | <alpha> | AlphaAnimation | 改变View透明度 |
补间动画的创建有两种形式:XML文件和代码形式,下面分别介绍它们。
1. XML文件形式
XML文件形式即通过在XML文件中设置相关属性来达到动画的效果,需要特别注意的是动画相关的XML文件必须放置在 res/anmi/ 文件夹中,如下图所示:
1.1 set标签
刚创建的文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
</set>
可以看到有一个 <set> 标签,表示的是动画集合,它可以包含若干个动画,并且其内部也是可以嵌套其他动画集合的。它有两个可指定的属性值如下:
属性 | 描述 |
---|---|
interpolator | 表示动画集合所采用的插值器,默认为加减速插值器 |
shareInterpolator | 表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或使用默认值 |
例子:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:shareInterpolator="false">
......
</set>
在这个例子中 intercepolator
设置为 @android:anim/accelerate_decelerate_interpolator
,即默认值,如果不设置该属性达到的效果也是一样的。将 shareInterpolator
属性设置为 false
表示集合中的动画不和集合共享同一插值器。
1.2 translate标签
<translate>标签用于控制平移动画,它可以使一个View在水平/竖直方向上完成平移的动画效果,它的一系列属性含义如下表所示:
属性 | 描述 |
---|---|
fromXDelta | 表示 x 的起始值 |
toXDelta | 表示 x 的结束值 |
fromYDelta | 表示 y 的起始值 |
toYDelta | 表示 y 的结束值 |
其中,各个属性有如下三种取值类型可供选择:
类型 | 描述 |
---|---|
float | 当取值为浮点类型的数值时,表示为绝对值类型,默认以px为单位 |
% | 相对自身的百分比取值,表示以当前View的宽度或高度为基数计算 |
%p | 相对父布局的百分比取值,表示以父视图的宽度或高度为基数计算 |
平移动画的起始点为View的左上角位置,如下图所示:
例子:
<translate
android:duration="100"
android:fromXDelta="0.5"
android:toXDelta="100.5"
android:fromYDelta="0.5"
android:toYDelta="100.5" />
该例子表示View从 (0.5, 0.5) 的位置平移到 (100.5, 100.5) 的位置,动画时间为100ms。
1.3 scale标签
<scale>标签表示缩放动画,它可以使View具有放大/缩小的效果,它的一系列属性含义如下表所示:
属性 | 描述 |
---|---|
fromXScale | 水平方向缩放的起始值 |
toXScale | 水平方向缩放的结束值 |
fromYScale | 竖直方向缩放的起始值 |
toYScale | 竖直方向缩放的结束值 |
pivotX | 缩放的轴点的 x 坐标 |
pivotY | 缩放的轴点的 y 坐标 |
例子:
<scale
android:duration="500"
android:fromXScale="0.5"
android:toXScale="1.5"
android:fromYScale="0.5"
android:toYScale="1.5"/>
这个例子是将View从原来的0.5倍放大到原来的1.5倍,动画时间是500ms。缩放轴点为View左上角(默认情况下),如果想以View中心为轴点,可以做如下设置:
<scale
android:duration="500"
android:fromXScale="0.5"
android:toXScale="1.5"
android:fromYScale="0.5"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"/>
其中轴点的取值方式也有三种类型可供选择:浮点型数字、相对自身的百分号%和相对父布局的百分比%p,这三种类型的含义在 translate 部分已经说过,这里不再赘述。
1.4 rotate标签
<rotate>标签表示旋转动画,它可以使View具有旋转的效果,它的一系列属性含义如下表所示:
属性 | 描述 |
---|---|
fromDegrees | 旋转开始的角度 |
toDegrees | 旋转结束的角度 |
pivotX | 旋转的轴点的 x 坐标 |
pivotY | 旋转的轴点的 y 坐标 |
<rotate
android:duration="400"
android:fromDegrees="0.0"
android:toDegrees="90.0"/>
该例子表示View从0°旋转90°,轴点为View的左上角(默认情况下)。如果想以View中心为轴点的话,可以按如下进行属性设置:
<rotate
android:duration="400"
android:fromDegrees="0.0"
android:toDegrees="90.0"
android:pivotX="50%"
android:pivotY="50%"/>
这和缩放动画中轴点的相关设置是一致的,同样可以有三种取值方式:浮点型数值、相对自身的百分比以及相对父布局的百分比,这里不再赘述。
1.5 alpha标签
<alpha>标签表示透明度动画,它可以改变View的透明度,它的一系列属性含义如下表所示:
属性 | 描述 |
---|---|
fromAlpha | 表示透明度的起始值 |
toAlpha | 表示透明度的结束值 |
alpha属性的取值为0.0~1.0。其中0.0表示完全透明,1.0表示完全不透明。
例子:
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
这个例子表示将View的透明度从完全透明变为完全不透明,动画时间为500ms。
1.6 共有属性
上面所说的为各自标签所特有的属性,它们之间也存在一些共有的属性,如下表所示:
属性 | 描述 |
---|---|
duration | 动画的持续时间,单位为ms |
fillAfter | 动画结束后View是否停留在结束位置,true表示停留在结束位置 |
startOffset | 动画执行延迟的时间,单位为ms |
interpolator | 用于控制动画在不同时段的执行速度,默认是加减速插值器 |
repeatCount | 动画的重复次数,默认为0,即不重复 |
repeatMode | 有两个取值:restart和reverse,reverse表示动画正反轮流执行,restart表示一直从头开始执行 |
zAdjustment | 在执行动画过程中调整Z轴的位置,有三个取值可选:normal、top和bottom,默认为normal |
前面的XML文件设置完成之后,我们在Java中如何将它们引入相关的View播放动画呢?这就要借助 AnimationUtils#loadAnimation
方法来添加了,例如我们现在要为一个 ImageView 添加动画,代码如下所示:
Animation anim = AnimationUtils.loadAnimation(MainActivity.this