5.0以前的动画(Animation Resources方面)
包含以下两大类型:
属性动画(Property Animation)
使用Animator来创建,通过修改对象随时间变化的属性值来创建动画。
View动画(View Animation)
使用animation框架,包含两种类型的动画:
补间动画(Tween animation):通过使用Animation对单一图片进行一系列变化(旋转,移动,放大缩小等)来生成动画
帧动画(Frame animation):通过使用AnimationDrawable顺序显示一系列图片来生成动画
以下介绍如何在资源文件中定义上述动画:
一)属性动画(Property Animation)
文件位置:res/animator/
filename.xml
可编译的资源数据类型:
可以使用ValueAnimator
, ObjectAnimator
, 或 AnimatorSet类来指向该资源。
如何使用该资源:
In Java: R.animator.
filename
In 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"]/> //如果值是颜色时不需要指定该属性,animation框架会自动处理颜色值。
<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>
例子如下:
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>
在代码中这样使用:
AnimatorSet set = (AnimatorSet)AnimatorInflator.loadAnimator(myContext, R.anim.property_animator);
set.setTarget(myObject);
set.start();
二)View动画(View Animation)
补间动画(Tween animation)
文件位置:res/anim/
filename.xml
可编译的资源数据类型:
可以使用Animation
类来指向该资源。
如何使用该资源:
In Java: R.anim.
filename
In XML: @[
package:]anim/
filename
语法:
<?xmlversion="1.0" encoding="utf-8"?>
<setxmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" |"false"] >
<alpha //对应AlphaAnimation
android:fromAlpha="float"
android:toAlpha="float"/>
<scale //对应ScalAnimation
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"/>
<translate //对应TranslateAnimation
android:fromXDelta="float" //5:像素绝对值,%5:想到自身的百分比,%5p:相对父类尺寸的百分比
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float"/>
<rotate //对应RotateAnimation
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float"/>
<set>
...
</set>
</set>
该文件必须有一个如下其中之一的根元素:<alpha>
, <scale>
, <translate>
, <rotate>
, 或<set>(包含一组动画,可嵌套)
。
例子如下:
res/anim/hyperspace_jump.xml
:
<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 image = (ImageView) findViewById(R.id.imageview1);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this,R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
三)Interpolator
5.o以前的Interpolator
Interpolator class |
Resource ID |
AccelerateDecelerateInterpolator |
|
AccelerateInterpolator |
|
AnticipateInterpolator |
|
AnticipateOvershootInterpolator |
|
BounceInterpolator |
|
CycleInterpolator |
|
DecelerateInterpolator |
|
LinearInterpolator |
|
OvershootInterpolator |
|
可以通过设置 android:interpolator
属性来使用上述Interpolator:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
如何自定义Interpolator
需要使用XML文件创建自己的,如可以修改AnticipateInterpolator的加速速率,或修改CycleInterpolator的循环次数。
文件位置:res/anim/
filename.xml
可编译的资源数据类型:
可以使用相应的interpolator类(见上表)来指向该资源。
如何使用该资源:
In XML:@[
package
:]anim/
filename
语法:
SYNTAX:
<?xmlversion="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
解释几个用到的属性:
android:factor 加速或减速速率,默认值为1,在<accelerateInterpolator>和<decelerateInterpolator>中用到。
android:tension
效果应用的强度,默认值为2,在<anticipateInterpolator>,<overshootInterpolator>和<anticipateOvershootInterpolator>中用到。
<anticipateInterpolator>是这样的动画效果:先向后然后急伸向前(The change starts backward then flings forward)。
<overshootInterpolator>是这样的动画效果:向前伸展并超过最后的值,然后反弹回来(
The change flings forward and overshoots the last value, then comes back)。当tension为0是没有向后的anticipation和向前的overshoot效果,就变成了一个简单的acceleration/deceleration插值器.
android:extraTension 在<anticipateOvershootInterpolator>中用到,用来跟tension相乘的, 默认值是1.5。<anticipateOvershootInterpolator>的动画效果是:先向后然后急伸向前并超过最后的值,然后稳定在最后的值上(The change starts backward, flings forward and overshoots the target value, then settles at the final value)。
例子如下:
res/anim/my_overshoot_interpolator.xml
:
<?xmlversion="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"
/>
在资源文件中这样使用:
<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" />
四)帧动画(Frame animation)
文件位置:res/drawable/
filename.xml
可编译的资源数据类型:
可以使用 AnimationDrawable
.来指向该资源。
如何使用该资源:
In Java:R.anim.
filename 或 R.drawable.
filename@[
package:]anim.
filename 或 @[
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"] > //true:只播放一次,fasle:循环播放动画
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
例子如下:
res/anim/rocket.xml
:
<?xmlversion="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>
mView3 = (ImageView) findViewById(R.id.imageview3);
mView3.setImageResource(R.anim.rocket);
AnimationDrawable anim = (AnimationDrawable)mView3.getDrawable();
anim.start();
或在资源文件中这样使用:
<ImageView android:id="@+id/imageview3"
android:layout_width="130dp"
android:layout_height="30dp"
android:src="@anim/rocket"/>