Android中的动画资源包含两种类型的动画:
1. 属性动画 Property Animation
创建一个动画对象,然后修改对象的属性值,这是基于一定时间的动画。
2. 视图动画 View animation
可以使用视图动画框架(view animation framework)来制作两种类型的动画:
1. 补间动画 Tween animation : 创建一个动画,通过执行一系列的转换单张图片,具有一个动画效果
2. 帧动画 Frame animation :创建一个动画,通过顺序地展示一些列图片(图片不只1张)
1 属性动画:
在XML中定义动画,通过修改目标对象的属性,比如背景颜色,或透明度值 ,它是基于一段时间的。
文件位置:res/animator/filename.xml
文件名会被作为一个资源ID使用
编译资源的数据类型:资源指向一个 ValueAnimator, ObjectAnimator 或 AnimatorSet
资源引用方式:
java中:R.animator.filename
xml中:@[package:]animator/filename
语法:
<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> ,<objectAnimator>,要么是<valueAnimator>
同时可以在元素内部,对动画进行分组或包含其他的元素
元素:
<set>: 一个容器,支持其他动画元素(<objectAnimator>, <valueAnimator>或其他 <set> 元素),代表一个动画集。可以嵌套标签,进一步分组动画。每一个能定义它自己的 ordering 属性
属性:android:ordering 该关键字,标识了在动画集中动画播放的顺序
值:sequentially 按顺序播放动画 值:together (default) 同时播放动画
<objectAnimator> 使一个对象的特定属性在一定时间动画化,代表了一个ObjectAnimator.
属性:
android:propertyName 要求是字符串。使对象的属性动画化,通过引用它的名字。例如,你可以为一个视图对象指定alpha或backgroundColor。该objectAnimator 不会暴露一个目标属性,然而不能在XML声明中设置对象到动画,必须通过调用 loadAnimator() 来加载动画XML资源,并调用 setTarget() 去设置包含该属性的目标对象。
android:valueTo 要求是float, int, or color 值。是动画属性结束的值,颜色用6个十六进制数表示,如#333333。
android:valueFrom 要求是 float, int 或 color 值。是动画属性开始的值。如果没有指定,动画开始通过属性的get方法获得值。颜色用6个十六进制数表示,如#333333。
android:duration 动画的时间,默认是 300 milliseconds。
android:startOffset 开始 start()调用后,动画的阻塞时间。
android:repeatCount 动画重复的次数。设置为 -1 代表无限循环 0 代表不重复(默认)正数 代表次数
android:repeatMode 动画重复的模式。当动画到达动画末端时,动画的行为。
android:repeatCount 必须被设置为正数或 -1 才会有效果(影响)。设置为"reverse",每次迭代会反转动画的方向;设置为"repeat每次开始时,动画会有一个循环。
android:valueType 如果值是一个颜色,不要指定该值。动画框架会自动处理颜色值。值:intType 值:floatType (default)
<animator> 基于一定时间执行的一个动画,代表了一个ValueAnimator。
属性:(同上)
例子:XML file saved at res/animator/property_animator.xml:
<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>
使用方式:
1. 使用加载器 加载XML资源到 AnimatorSet对象中
2. 开始动画前,为所有的动画注册目标对象
3. 启动动画
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
2 视图动画 View Animation
视图动画框架既支持补间动画又支持帧动画,两者都能在XML中定义。下面描述怎么使用两种方法:
2.1 补间动画
文件位置:res/anim/filename.xml
文件名会被用作资源ID
编译资源文件数据类型:Animation
资源引用:
java中: R.anim.filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource" interpolation插入
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>: 一个容器,支持其他的动画元素,(<alpha>, <scale>, <translate>, <rotate>或其他<set>元素) 代表 AnimationSet。
属性:
android:interpolator 插入者,应用动画的插入者,该值必须是一个指向某个插入者(不是一个插入者的类名)资源的引用。
android:shareInterpolator 如果你想和子元素共享相同的插入者,就为true ;
<alpha>: 褪色动画,代表 AlphaAnimation
android:fromAlpha 0.0 - 1.0
android:toAlpha
<scale>: 重设大小的动画
android:fromXScale 设置为1.0 不改变
android:toXScale
android:fromYScale
android:toYScale
android:pivotX
android:pivotY
<translate>: 一个垂直或水平方向的移动 有下面3种格式的属性值:
-100% — 100% 说明相对于它自身的百分比
-100%p —100%p 说明相当于它父容器的百分比
没有前缀的浮点数,说明是绝对值
属性:
android:fromXDelta
android:toXDelta
android:fromYDelta
android:toYDelta
一个轮转或旋转动画
属性:
android:fromDegrees
android:toDegrees
android:pivotX
android:pivotY
例子:
<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>
应用这个动画到一个ImageView上:
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
Interpolators (插入者) Interpolators 是 XML 中定义的一个动画修饰符,影响一个动画改变的频率。它允许存在的动画,加速。减速,重复,和退回(反弹,颠簸)等。一个插入者通过android:interpolator属性应用到动画元素,它的值是一个 interpolator 资源的引用。
在android中,所有可用的interpolator都是Interpolator 类的子类。对于每个Interpolator 类来说,android包括一些你可引用的公共资源,以至于你可以通过android:interpolator属性应用Interpolator到动画中。下面的表给出了一些可用的资源:
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 |
下面是如何引用这些资源的方法:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
2.2 自定义interpolator
如果你对平台提供的interpolator不满意,你可以创建自定义的interpolator资源。例如,AnticipateInterpolator调整加速的速度,或者调整 CycleInterpolator的次数。为了做到这些,你需要在XML文件中创建你自己的Interpolator。
文件的位置:
res/anim/filename.xml
文件名被用作资源ID
编译的资源的数据类型:
一个Interpolator对象
资源的引用方式:
在XML中:@[package:]anim/filename
语法:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"/>
如果你不使用任何属性,那么你的Interpolator和平台提供的一样。
元素:
<accelerateDecelerateInterpolator>
开始和结束速率较慢,但中间的时候快,该标签没有属性。
<accelerateInterpolator>
开始的时候慢,然后加速,标签属性:android:factor Float类型,加速的速率。默认值为1。
<anticipateInterpolator>
变化开始向后,然后向前。标签属性:android:tension Float类型 tension 张力大小 。默认值为2。
<anticipateOvershootInterpolator>
变化开始向后,向前,然后冲到目标值,然后设置到最终值。属性值:android:tension tension 张力大小 。默认值为2 android:extraTension 张力值 默认值为1.5。
<bounceInterpolator>
变化是在末尾回退。没有属性。
<cycleInterpolator>
重复动画的次数,变化率遵循sinusoidal 模式。 标签属性: android:cycles Integer循环的次数。默认值为1。
<decelerateInterpolator>
开始变化很快,然后减速。 属性:android:factor 默认值为1。
<linearInterpolator>
变化率是常量。没有属性。
<overshootInterpolator>
向前变化,冲到最后值,然后返回。属性: android:tension Float. 默认值为2。
例子:
文件保存在res/anim/my_overshoot_interpolator.xml
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"/>
在动画XML中应用 interpolator:
<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" />
2.3 帧动画 Frame Animation
使用XML定义的一种动画,按序展示一组图片(就像电影)。
文件位置:
res/drawable/filename.xml 文件名会作为资源ID
编译的资源数据类型:
AnimationDrawable
资源引用方式:
java中:R.drawable.filename
XML中:@[package:]drawable.filename
语法:
<?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>
元素:
<animation-list>
该标签必须有。它是根元素,包含一个或多个<item>元素
属性:
android:oneshot Boolean 如果为true只执行动画1次;false,循环动画。
<item>
动画的一帧,必须是<animation-list>元素的子元素。
属性:
android:drawable 图像资源,图像用来作为每一帧
android:duration Integer 展示该帧的时间,以milliseconds计。
例子:
文件保存在:res/anim/rocket.xml
<?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>
应用代码,设置动画为一个View的背景,然后开始播放动画。
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
具体例子请看:https://github.com/Luise-li