插补器
插补器是一个被定义在XML中的能够影响动画的变化频率的编辑器。它会对既存动画的加速、减速、重放、反弹等效果等形成影响。
使用android:interpolator属性,把插补器应用到一个动画元素,它的值是一个插补器资源的引用。
在Android中所有可用的插补器都是Interpolator类的子类。对于每个插补器类,Android都包含了一个能够引用的公共资源,以便把这个插补器应用于动画所使用的android:interpolator属性。下表中指定了每个插补器可用的资源。
插补器类 |
资源ID |
AccelerateDecelerateInterpolator |
|
AccelerateInterpolator |
|
AnticipateInterpolator |
|
AnticipateOvershootInterpolator |
|
BounceInterpolator |
|
CycleInterpolator |
|
DecelerateInterpolator |
|
LinearInterpolator |
|
OvershootInterpolator |
|
可以像下面这样来设定android:interpolator属性:
<setandroid:interpolator="@android:anim/accelerate_interpolator">
...
</set>
定制插补器
如果对平台提供的插补器不满意(上表中列出的插补器),还可以编辑属性的方法来创建定制的插补器资源。如,能够调整AnticipateInterpolator插补器的加速频率,也能够调整CycleInterpolator插补器的周期数量。要达到这个目的,需要在一个XML文件中创建自己的插补器资源。
文件位置(FILE LOCATION):
res/anim/filename.xml,文件名会作为资源的ID。
被编译的资源类型(COMPILED RESOURCE DATATYPE)
资源指向相应的插补器对象
资源引用(RESOURCE REFERENCE):
在XML中:@[package:]anim/filename
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorNamexmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
如果没有应用任何属性,那么这个定制的插补器会与平台提供的插补器具有完全相同的功能。
元素(ELEMENTS):
注意,每个插补器的实现,当在XML中定义时,都是用小写字母开头的。
<accelerateDecelerateInterpolator>
降低动画开始和结束时变化的频率,但在动画的中间部分加速。
没有属性
<accelerateInterpolator>
降低动画启动时变化的频率,然后开始加速
属性(ATTRIBUTES):
android:factor
浮点值,指定加速频率(默认是1)
<anticipateInterpolator>
动画启动时先向后,然后再向前变化(橡皮筋效果)。
属性(ATTRIBUTES):
android:tension
浮点值,指定拉力数(默认是2)
<anticipateOvershootInterpolator>
动画启动时先向后,然后再向前,并飞过目标值,然后再终点稳定。
属性(ATTRIBUTES):
android:tension
浮点值,指定拉力数(默认是2)
android:extraTension
浮点值,指定拉力的倍数(默认是1.5)
<bounceInterpolator>
在动画结尾的反弹效果。
没有属性
<cycleInterpolator>
用指定的循环数重复动画,变化频率是按照正弦模式进行。
属性(ATTRIBUTES):
android:cycles
整数值,指定循环周期数(默认是1)。
<decelerateInterpolator>
动画启动时,快速跳出,然后减速。
属性(ATTRIBUTES):
android:factor
浮点值,指定减速比率(默认是1)
<linearInterpolator>
动画的变化频率是固定的。
没有属性。
<overshootInterpolator>
向前抛出,并飞过终点,然后再返回来。
属性(ATTRIBUTES):
android:tension
浮点值,设定拉力数(默认是2)
例子:
XML文件被保存在res/anim/my_overshoot_interpolator.xml:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolatorxmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"
/>
以下是这个动画XML使用的插补器:
<scalexmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"/>
帧动画
定义在XML中动画,它会电影那样,按序播放图片。
文件位置(FILE LOCATION):
res/drawable/filename.xml
文件名被用作资源的ID。
被编译资源类型(COMPILED RESOURCE DATATYPE):
资源指向一个AnimationDrawable对象
资源引用(RESOURCE REFERENCE)
在Java代码中:R.drawable.filename
在XML中:@[package:]drawable.filename
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer"/>
</animation-list>
元素(ELEMENTS):
<animation-list>
必须的,它必须是根元素。它要包含一个或多个<item>元素。
属性(ATTRIBUTES):
android:oneshot
布尔值,如果只想让动画执行一次,那么就设定为“true”,否则,设定为“false”来循环播放动画。
<item>
动画的一帧,必须是<animation-list>元素的子元素。
属性(ATTRIBUTES):
android:drawable
指定用于本帧动画的可描画资源。
android:duration
整数值,以毫秒为单位,显示本帧动画的持续时间。
例子:
XML文件被保存在res/anim/rocket.xml中:
<?xml version="1.0" encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<itemandroid:drawable="@drawable/rocket_thrust1"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
<itemandroid:drawable="@drawable/rocket_thrust3"android:duration="200"/>
</animation-list>
应用程序代码会把这个动画设置为一个View对象的背景,然后播放动画:
ImageView rocketImage =(ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation =(AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();