与Android中大多数的UI代码类似,动画可以在代码中定义也可以在XML中定义。不过,建议使用XML,因为创建复杂动画更容易并且能够复用。定义在XML中的视图动画被放置于res/anim/文件夹下。一个动画的基础结构与视图的类似。
下面是视图动画的可用选项:
下面是一个移动(translate)视图的示例动画:
动画xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration = "5000"
android:toYDelta="100%"
android:toXDelta="100%">
</translate>
活动xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
</LinearLayout>
活动代码
package com.test.androidtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class AnimationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
//将动画xml绑定到视图
ImageView img = (ImageView) findViewById(R.id.img);
Animation anim_translate = AnimationUtils.loadAnimation(this, R.anim.anim_translate);
img.startAnimation(anim_translate);
}
}
动画XML等价于下面的Java代码
TranslateAnimation anim = new TranslateAnimation( TranslateAnimation.RELATIVE_TO_SELF, 0.0f, TranslateAnimation.RELATIVE_TO_SELF, 0.25f, TranslateAnimation.RELATIVE_TO_SELF, 0.0f, TranslateAnimation.RELATIVE_TO_SELF, 0.25f); anim.setDuration(5000);//持续5秒
运行测试
动画可以组成集合,让几个动画同时发生。下面是一个相同的例子,但是这一次与另一个改变视图透明度的动画组成一个集合:
动画XML
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration = "5000"
android:toYDelta="100%"
android:toXDelta="100%" />
<alpha
android:duration="5000"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
这个动画将会让视图移动到右下方,并同时逐渐淡化。在此例中,两个动画同时发生,但是这并不是必须的。你可以通过定义android:startOffset属性让它们顺序发生,或者部分重叠。以ms为单位设置这个值可以让动画等待这个时间间隔再发生。下面是一个同样的例子,不过这一次alpha动画会等到移动动画结束之后才开始:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration = "5000"
android:toYDelta="100%"
android:toXDelta="100%" />
<alpha
android:startOffset="5000"
android:duration="5000"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
你可以使用这个属性来让几个动画顺序发生。此外,你还可以嵌套动画来创建更加复杂的动画。查看Android文档以得到完整的动画选项列表。