本文介绍了Android中的资源文件属性动画、View动画、插值器及自定义插值器和帧动画的使用。
原文链接:Animation Resources
Android中动画分为属性动画和View动画。View动画又分为补间动画和帧动画。
属性动画
- 文件存放位置:res/animator/filename.xml
- 在JAVA中引用:R.animator.filename
- 在XML中引用: @[package:]animator/filename
属性动画的语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
- 动画集合set对应的类为AnimatorSet
- objectAnimator对应的类为ObjectAnimator
- animator对应的类为ValueAnimator
- android:ordering:sequentially表示依次播放动画,默认为together表示同时播放动画
- android:propertyName:属性名,例如:alpha或backgroundColor,必需值
- android:valueTo:动画结束时的属性值,颜色是一个十六进制的六位数,例如:#333333,必需值
- android:valueFrom:动画开始时属性值,如果不指定,值为通过属性的get方法获取
- android:duration:持续时间,单位为毫秒,默认为300ms
- android:startOffset:动画延时播放毫秒时间
- android:repeatCount:重复次数,-1为无限循环,默认为0
- android:repeatMode:重复模式,repeatCount必须设置为-1或正整数,此属性才会生效,reverse表示反转,repeat表示每次都从开始播放
- android:valueType:属性值的类型,默认为floatType表示浮点数,intType表示整数值,如果值为颜色,不要指定这个属性,动画框架会自动处理颜色值
例如,文件存放在res/animator/property_animator.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<set android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="intType"/>
</set>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1f"/>
</set>
通过代码加载动画资源并通过setTarget方法设置对象:1
2
3
4AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.animator.property_animator);
set.setTarget(myObject);
set.start();
View动画
View动画包括平移、缩放、旋转和透明度四种动画效果。我们可以使用xml文件创建View动画,也可以使用代码创建动画。
- 文件存放位置:res/anim/filename.xml
- 在JAVA中引用:R.anim.filename
- 在XML中引用: @[package:]anim/filename
View动画的XML语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
- 动画集合set对应类为AnimationSet
- 透明度动画alpha对应AlphaAnimation
- 缩放动画scale对应类为ScaleAnimation
- 平移动画translate对应类为TranslateAnimation
- 旋转rotate对应类为RotateAnimation
- android:interpolator表示使用的插值器的类型
- android:shareInterpolator表示集合中的动画是否共享同一个插值器
- android:fromAlpha和android:toAlpha:动画开始和结束从透明度0.0透明到1.0不透明
- android:fromXScale、android:toXScale、android:fromYScale、tandroid:oYScale:缩放动画开始和结束缩放值,1.0为正常大小
- android:fromXDelta、android:toXDelta、android:fromYDelta、tandroid:oYDelta:平移动画开始和结束的位置,可取值有三种格式:相对位置的像素(例如:“5”),相对元素的百分比(例如:“5%”),相对父元素的宽(X)高(Y)比(例如:“5%p”)
- android:fromDegrees和android:toDegrees:旋转动画开始和结束旋转度数
- android:pivotX和android:pivotY:动画缩放或旋转时的中心点,可取值有三种格式:相对元素左边或上边的像素(例如:”5”),相对元素左边或上边的百分比(例如:“5%”),相对父元素左边或上边的百分比(例如:”5%p”)
例如,文件存放在res/anim/hyperspace_jump.xml:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
</set>
通过代码加载动画资源应用到图片上并开始动画:1
2
3ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
插值器
插值器会影响动画的速率。这可以让现有的动画加速,减速,重复,反弹等等。
下表为每个插值器可使用的资源:
Interpolator class | Resource ID |
---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator |
AccelerateInterpolator | @android:anim/accelerate_interpolator |
AnticipateInterpolator | @android:anim/anticipate_interpolator |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator |
BounceInterpolator | @android:anim/bounce_interpolator |
CycleInterpolator | @android:anim/cycle_interpolator |
DecelerateInterpolator | @android:anim/decelerate_interpolator |
LinearInterpolator | @android:anim/linear_interpolator |
OvershootInterpolator | @android:anim/overshoot_interpolator |
在XML文件中使用插值器:1
2
3<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
API demos中提供的效果:
自定义插值器
如果上表提供的插值器无法满足你的需求,你可以自定义插值器。
- 文件存放位置:res/anim/filename.xml
- 在XML中引用: @[package:]anim/filename
自定义插值器语法:1
2
3
4<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
如果你没有修改任何属性,那你自定义的插值器将会和系统提供的插值器效果一致。
注意每个插值器的实现,当定义在XML中,它是小写字母开头。
<accelerateDecelerateInterpolator>
开头和结尾慢,中间快。没有属性。<accelerateInterpolator>
开头慢,然后加速。属性android:factor加速速率Float(默认为1)。<anticipateInterpolator>
开始后退然后向前冲。属性android:tension应用的张力Float(默认为2)。<anticipateOvershootInterpolator>
开始后退,向前冲并且超越目标值,然后回落在最终值。属性android:tension应用的张力Float(默认为2),属性android:extraTension多层张力Float(默认为1.5).<bounceInterpolator>
在最后反弹。没有属性。<cycleInterpolator>
动画重复指定的循环次数。速率遵循正弦模式。属性android:cycles循环次数Integer(默认为1)。<decelerateInterpolator>
开头快,然后减速。属性android:factor减速速率Float(默认为1)。<linearInterpolator>
线性插值器,速率无变化。没有属性。<overshootInterpolator>
向前冲并且超出最后值,然后回来。属性android:tension应用的张力Float(默认为2)。
例如,文件存放在res/anim/my_overshoot_interpolator.xml:1
2
3
4<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"
/>
把插值器应用到动画:1
2
3
4
5
6
7
8
9<scale xmlns: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" />
帧动画
帧动画就是顺序播放一组序列图片,注意图片过大会引起OOM。
- 文件存放位置:res/drawable/filename.xml
- 在JAVA中引用:R.drawable.filename
- 在XML中引用: @[package:]drawable/filename
帧动画语法:1
2
3
4
5
6
7<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns: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>
- 对应类为AnimationDrawable
- android:oneshot:true表示只播放一次,false表示循环播放动画
<item>
一个动画的单帧,必须作为的子元素- android:drawable:图片资源
- android:duration:持续时间,单位毫秒
例如,文件存放在res/drawable/rocket.xml:1
2
3
4
5
6
7<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
在代码中设置动画为图片的背景,然后播放动画:1
2
3
4
5ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();