Android系统提供了两种动画框架:property动画(属性动画)和View动画(视图动画)。这两个动画系统都是可行的方案,但在一般情况下,属性动画系统被优先使用,因为它更灵活,并且提供了更多的功能,除了两个动画系统之外,也可以利用Drawable动画,它允许加载Drawable资源,一帧一帧的显示这些Drawable资源。
这里先学习View动画,Android View Animamtion包括两种:Tween和frame。
一、Tween动画简单介绍:
Tween动画(补间动画)根据一些信息来计算动画,如:起点(start point)、终点(end point)、尺寸(size)、旋转(rotation)和动画的其他共同点,可以在视图对象的内容上进行一系列简单的变换(位置、大小、旋转、透明度)。比如,如果有一个TextView对象,就可以移动、旋转、放大或者缩小它,如果它还有一张背景图,背景图则和它一起变换。
Tween动画属性通常定义在XML文件中,其路径:res/anim/filename.xml。如:
<?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>
xml文件必须有一个root元素,要么是 <alpha>, <scale>, <translate>, <rotate>, 或者<set> 元素,该元素持有一组(或多组)其他动画元素(甚至嵌套的<set>元素)。
各元素介绍:
1)<set>:一个持有其他动画元素的容器,表示一个AnimationSet(一个类,可在源码中找到)。
<set>属性参数:
android:interpolator:interpolator(插值器)资源,一个Interpolator 应用在动画上,它的值必须引用指向一个interpolator的资源(不是一个interpolator的类名)。在Android平台上有默认的interpolator资源可用,或者创建自己的interpolator资源。
android:shareInterpolator:其值为布尔类型。如果你想要在所有的子元素中共享同一个interpolator,其值为“true”。
2)<alpha>:淡入或淡出动画。表示一个AlphaAnimation(类)。
<alpha>属性参数:
android:fromAlpha:其值为Float类型,表示起点不透明度偏移,0.0表示透明,1.0表示不透明。
android:toAlpha:其值为Float类型,表示终点不透明度偏移,0.0表示透明,1.0表示不透明。
3)<scale>:表示一个伸缩动画,可以通过指定pivotX和pivotY来指定image向外和向内伸缩的中心点。比如:pivotX和pivotY为0和0(左上角),这意味着所有的伸展将向下和向右。这个元素表示一个ScaleAnimation(类)。
<scale>属性参数:
android:fromXScale:其值为Float类型,表示起点X轴偏移量,其值为1.0表示没有任何变化。
android:toXScale:其值为Float类型,表示终点X轴偏移量,其值为1.0表示没有任何变化。
android:fromYScale:其值为Float类型,表示起点Y轴偏移量,其值为1.0表示没有任何变化。
android:toYScale:其值为Float类型,表示终点Y轴偏移量,其值为1.0表示没有任何变化。
android:pivotX:其值为Float类型,表示,当对象缩放时,X坐标保持固定。
android:pivotY:其值为Float类型,表示,当对象缩放时,Y坐标保持固定。
4)<translate>:垂直和/或水平运动,支持一下任何三种格式:值的范围从-100到100,并以“%”结束,表示相对于自身的百分比;值的范围从-100到100,并以“%p“结束,表示相对于其父类属性额百分比;值为没有后缀的Float类型,表示一个TranslateAnimation(类)。
<translate>属性参数:
android:fromXDelta:值为Float类型或者百分比。起点X轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
android:toXDelta:值为Float类型或者百分比。终点X轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
android:fromYDelta:值为Float类型或者百分比。起点Y轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
android:toYDelta:值为Float类型或者百分比。终点Y轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
5)<rotate>:一个旋转动画。表示一个RotateAnimation(类)。
<rotate>属性参数:
android:fromDegrees:值为Float类型,表示起点的角度位置,以度为单位。
android:toDegrees:值为Float类型,表示终点的角度位置,以度为单位。
android:pivotX:值为Float类型或者百分比,指示旋转中心的X轴坐标。要么以像素为单位表示相对于对象左边缘的值(如:“5”),要么以百分比为单位表示相对于对象左边缘的值(如:“5%”),要么以百分比为单位表示相对于其父容器元件的左边缘的值(如“5%p”)。
android:pivotY:值为Float类型或者百分比,指示旋转中心的Y轴坐标。要么以像素为单位表示相对于对象顶边的值(如:“5”),要么以百分比为单位表示相对于对象顶边的值(如:“5%”),要么以百分比为单位表示相对于其父容器元件顶边的值(如“5%p”)。
其他XML属性参数:
XML Attributes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Attribute Name
|
Related Method
|
Description
| |||||||||
android:detachWallpaper | setDetachWallpaper(boolean) | Window动画的特殊选项,如果这个window在墙纸的上面,则不让墙纸与它一起有动画效果。 | |||||||||
android:duration | setDuration(long) | 动画运行的时间(以毫秒为单位). | |||||||||
android:fillAfter | setFillAfter(boolean) | 如果设置为true,在动画结束之后,动画变换才被应用。 | |||||||||
android:fillBefore | setFillBefore(boolean) | 如果设置为true或者fillEnabled未设置为true,在动画开始前,动画变换被应用。 | |||||||||
android:fillEnabled | setFillEnabled(boolean) | 如果设置为true,fillBefore的值也被考虑在内。 | |||||||||
android:interpolator | setInterpolator(Interpolator) | 设置interpolator | |||||||||
android:repeatCount | setRepeatCount(int) | 定义动画应该重复多少次。 | |||||||||
android:repeatMode | setRepeatMode(int) | Defines the animation behavior when it reaches the end and the repeat count is greater than 0 or infinite. | |||||||||
android:startOffset | setStartOffset(long) | Delay in milliseconds before the animation runs, once start time is reached. | |||||||||
android:zAdjustment | setZAdjustment(int) | Allows for an adjustment of the Z ordering of the content being animated for the duration of the animation. |
interpolator说明:
interpolator是一个动画调节器,定义在XML资源文件中,影响动画变化的速率。现有interpolator动画效果有:accelerated(加速)、decelerated(减速)、repeated(反复)、bounced(反弹)等。
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 |
如:
<setandroid:interpolator="@android:anim/accelerate_interpolator">
...
</set>
自定义interpolators:
如果不满意Android平台提供的interpolators(如上表),可以通过修改属性参数来自定义一个interpolator。例如:可以为AnticipateInterpolator调整加速度的速率,或为CycleInterpolator调整循环周期的数目。要做到这些,需要在XML中创建自己的interpolator资源。
1)xml文件位置:res/anim/filename.xml。
2)编译资源数据类型:资源指向对应的interpolator对象。
3)资源引用:@[package:]anim/filename
3)资源引用:@[package:]anim/filename
4)语法:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorNamexmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
如果在此xml资源文件中,不修改任何参数,那么这个interpolator就和它所指向的interpolator一样。
5)元素:请注意每个Interpolator的实现,在XML中定义时,用小写的名称。
<accelerateDecelerateInterpolator>:开始和结束时的变化速率缓慢,但是中间却会加速,无属性参数。例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set>
hyperspaceAnimation = AnimationUtils.loadAnimation(this, R.anim.macceleratedecelerateinterpolator);
<accelerateInterpolator>:变换速率开始缓慢,然后加速。属性参数:android:factor:值为Float类型,表示加速度(默认为1). 例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
<anticipateInterpolator>:变换开始先向后,然后向前。属性参数:android:tension:表示提供的拉伸力度(默认为2),例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/anticipate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
<anticipateOvershootInterpolator>:变换开始向后,然后甩向前,然后渡过到目标值,最后稳定在最后的值。属性参数:android:tension:表示提供的拉伸力度(默认为2)。例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set>
<bounceInterpolator>:变换在结束时反弹。无属性参数。例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/bounce_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
<cycleInterpolator>:根据指定的循环数目重复动画,变换速率遵循正弦模式。属性参数:android:cycles:值为整型,表示循环的次数(默认为1)。 例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/cycle_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
android:repeatCount="0"
/>
</set>
<linearInterpolator>:变换速率是恒定的,无属性参数。例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/linear_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set>
<overshootInterpolator>:变换甩向前,然后过渡到最后的值,然后返回。属性参数:android:tension:表示提供的拉伸力度(默认为2)。如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/overshoot_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
hyperspaceAnimation = AnimationUtils.loadAnimation(this, R.anim.movershootinterpolator);
mImageView.startAnimation(hyperspaceAnimation);
关于interpolator,有兴趣可以参考一下这篇博客:http://www.cnblogs.com/mengdd/p/3346003.html
二、Frame动画(帧动画):
1)资源文件位置:res/drawable/filename.xml(filename将被用作此资源的ID)
2)编译资源数据类型:资源指向AnimationDrawable。
3)语法:
<?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>
4)元素:
<animation-list>:这必须是root元素,包含一个或多个<item>元素。
属性参数:
android:oneshot:值为布尔类型,如果值为true,表示动画只进行一次,如果值为false,表示循环动画。
<item>:动画的单个帧,必须是<animation-list>元素子元素。
属性参数:
android:drawable:Drawable资源。
android:duration:值为整数,表示frame动画持续的时间,以毫秒为单位。
举例:
<?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> ImageView rocketImage =(ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.drawable.rocket_thrust); rocketAnimation =(AnimationDrawable) rocketImage.getBackground(); rocketAnimation.start();
frame 动画和Drawable Animation很像。