Animator代表一个属性动画,但它只是一个抽象类,通常会使用它的子类:AnimatiorSet、ValueAnimator、ObjectAnimator、TimeAnimator。
下面介绍属性动画资源。
定义属性动画的XML资源文件能以如下三个元素中的任意一个作为根元素。
- <set.../>:它是一个父元素,用于包含其他<objectAnimator.../>、<animator.../>或<set.../>子元素,该元素定义的资源代表AnimatorSet对象。
- <objectAnimator.../>:用于定义ObjectAnimator动画。
- <animator.../>:用于定义ValueAnimator动画。
定义属性动画的语法格式如下:
<?xml version="1.0" encoding="utf-8"?> <set android:ordering=["together"|"sequentially"]> <set> <objectAnimator android:propertyName="string" android:duration="int" android:valueFrom="float|int|color" android:valueTo="float|int|color" android:startOffset="int" android:repeatCount="int" android:interpolator="" android:repeatMode=["repeate"|"reverse"] android:valueType=["intType"|"floatType"]/> <objectAnimator android:duration="int" android:valueFrom="float|int|color" android:valueTo="float|int|color" android:startOffset="int" android:repeatCount="int" android:interpolator="" android:repeatMode=["repeat"|"reverse"] android:valueType="intType"/> </set> <set> ... </set> </set>
实例:不断渐变的背景色
该实例将会使用属性动画来控制组件背景色不断改变。该实例所使用的属性动画资源文件如下。
程序清单: esanimatorcolor_anim.xml
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:propertyName="backgroundColor" android:duration="3000" android:valueFrom="#FF8080" android:valueTo="#8080FF" android:repeatCount="infinite" android:repeatMode="reverse" android:valueType="intType" > </objectAnimator>
上面的代码定义了一个ObjectAnimator对象,接下来程序就可以通过属性动画来控制指定组件背景色不断改变。
该实例的布局文件如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/container" > </LinearLayout>
下面是该实例的Activity代码。
package com.example.studyresources; import android.os.Bundle; import android.animation.AnimatorInflater; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.View; import android.widget.LinearLayout; public class AnimatorTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animator_test); LinearLayout container=(LinearLayout)findViewById(R.id.container); //添加MyAnimationView组件 container.addView(new MyAnimationView(this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.animator_test, menu); return true; } public class MyAnimationView extends View { public MyAnimationView(Context context) { super(context); //加载动画资源 ObjectAnimator colorAnim=(ObjectAnimator)AnimatorInflater.loadAnimator( AnimatorTest.this,R.animator.color_anim); colorAnim.setEvaluator(new ArgbEvaluator()); //对该View本身应用属性动画 colorAnim.setTarget(this); //开始指定动画 colorAnim.start(); } } }
上面的程序中粗体字代码使用AnimatorInflater工具类加载了指定动画资源文件、将该动画资源文件转换为ObjectAnimator对象。接下来程序对MyAnimationView本身应用该动画,将可以看到该组件的背景色不断变化,如图6.8所示。