目录
表10-11 TranslateAnimation类的常用方法
10.4.3 动画监听器:AnimationListener
表 10-15 AnimationListener接口定义的方法
【例10-23】定义Activity程序,使用动画监听,进行动画操作
代码——04100408_Animation配置xml实现(渐变)
【例10-24】定义res\anim\alpha.xml文件,定义渐变操作配置
【例10-26】定义Activity程序,读取alpha.xml文件
代码——04100409_Animation配置xml实现(缩放)
【例10-28】定义布局管理器——main.xml(考虑到篇幅以后不再重复列出)
【例10-29】定义Activity程序,读取动画配置(部分代码)
代码——04100410_Animation配置xml实现(平移)
【例10-30】定义平移动画的配置文件 res\anim\translate.xml
代码——04100411_Animation配置xml实现(旋转)
【例10-31】定义旋转动画的配置文件 res\anim\rotate.xml
代码——04100412_Animation配置xml实现(动画叠加)
【例10-32】定义平移及缩放的动画配置文件——res\anim\all.xml
代码——04100413_Animation配置xml实现(控制速率)
【例10-33】定义速率的配置文件——res\anim\all.xml
表10-23 AnimationDrawable类的常用方法
【例10-34】 定义一个动画配置资源——res\anim\allface.xml
10.4.6 LayoutAnimationController 组件
代码——04100415_LayoutAnimationController(GridView)
【例10-38】配置 LayoutAnimationController 的配置文件 res\anim\layout_animation.xml
【例10-39】定义GridView显示的图片适配器——ImageAdapter.java
代码——04100416_LayoutAnimationController(ListView)
【例10-42】定义ListView显示的布局管理器——info.xml
【例10-44】 编写Activity程序,在ListView上显示信息
代码——04100417_LayoutAnimationController(ListView编码实现动画)
【例10-46】定义 Activity 程序,手工配置 LayoutAnimationController
Animation动画的作用和分类
在Android系统中,如果要对控件进行一些动画的处理操作,则可以使用Animation组件来实现,Animation可以为控件设置旋转、移动、淡入淡出等效果。Animation共分为两类进行操作。
Tweened Animation(渐变动画):该类Animation 可以完成控件的旋转、移动、伸缩、 淡入淡出等特效.
Frame Animation(帧动画):可以将预先定义好的对象按照电影的形式进行播放。
下面将通过实际的代码及操作,说明这两种动画效果的操作。
10.4.1 Tweened Animation
Tweened Animation表示一些基本的动画元素操作,所有的Animation操作的方法都在android.view.animation.Animation类中定义,Animation类中的常用方法及常量,如表10-8所示。
表10-8 Animation类定义的常用方法及常量
Tweened Animation动画操作有4个主要的类型,介绍如下。
- alpha (android.view.animation.AlphaAnimation):定义渐变透明度动画效果,如图片的 淡入淡出。
- scale (android.view.animation.ScaleAnimation ):定义动画的伸缩效果。
- translate (android.view.animation.TranslateAnimation):定义动画转换位置移动的效果。
- rotate (android.view.animation.RotateAnimation):定义图片旋转效果的移动动画。
在以上4个动画类型中,分别定义了 4个Animation的子类:AlphaAnimation、ScaleAnimation、TranslateAnimation和RotateAnimation,以完成不同的动画操作,这4个子类的常用方法,分别如:表10.9〜表10.12所示。
表10-9 AlphaAnimation类的常用方法
表10-10 ScaleAnimation类的常用方法
表10-11 TranslateAnimation类的常用方法
表10-12 RotateAnimation类的常用方法
AnimationSet类
了解了 Animation类及其子类的概念之后,下面来看一下android.view.animation.AnimationSet 类。AnimationSet类可以理解为一个动画效果的集合,在里面可以同时保存多个动画效果,其继承结构如下:
可以发现,AnimationSet本身也是Animation的子类,所以许多方法可以直接从Animation 类继承下来使用,
AnimationSet类的常用方法,如表10-13所示。
表10-13 AnimationSet类的常用方法
下面通过几个实际的操作来观察如何使用Animation进行动画的设置。
1.渐变操作(alpha)动画显示
代码——04100401_Animation(渐变)
【例10-10】定义布局管理器—main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-11】定义Activity程序操作动画
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.AnimationSet;
import android.widget.ImageView;
/**
* 渐变操作(alpha)动画显示
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
AlphaAnimation alpha = new AlphaAnimation(1, 0);// 1表示完全显示-->0表示完全透明
alpha.setDuration(3000);// 3秒完成动画
set.addAnimation(alpha);// 增加动画
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
在本程序中为了方便,直接在图片组件上设置了单击事件,当单击之后,图片将使用alpha(渐 变)效果进行动画显示,动画的持续时间为3秒 ( alpha.setDuration(3000) ) ,程序的运行效果如:图10-10所示。
2.伸缩操作(scale)动画显示
代码——04100402_Animation(缩放)
【例10-12】定义布局管理器—— main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-13】定义Activity程序进行动画处理
package org.lxh.demoTest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
/**
* 伸缩操作(scale)动画显示
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
ScaleAnimation scale = new ScaleAnimation(
1, 0.0f,// X轴从满屏缩小到无
1, 0.0f,// Y轴从满屏缩小到无
Animation.RELATIVE_TO_SELF, 0.5f,// 以自身0.5宽度为轴缩放
Animation.RELATIVE_TO_SELF, 0.5f);// 以自身0.5高度为轴缩放
scale.setDuration(3000);// 3秒完成动画
set.addAnimation(scale);// 增加动画
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
本程序采用缩放操作类(ScaleAnimation)完成动画效果,在进行缩放时,缩放是以图片自身的一半为轴进行的,如图10-11所示,
程序的最终效果如图10-12所示
3.平移操作(translate)动画显示
代码——04100403_Animation(平移)
【例10-14】定义布局管理器一main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-15】定义Activity程序进行平移操作
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
/**
* 平移操作(translate)动画显示
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
TranslateAnimation tran = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,// X轴开始位置
Animation.RELATIVE_TO_SELF, 0.5f,// X轴结束位置
Animation.RELATIVE_TO_SELF, 0.0f,// Y轴开始位置
Animation.RELATIVE_TO_SELF, 1.5f);// Y轴结束位置
tran.setDuration(3000);// 3秒完成动画
set.addAnimation(tran);// 增加动画
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
本程序在进行动画操作时使用TranslateAnimation类进行平移, 移动的方式是以图片自身为轴进行移动,如图10-13所示,而程序的运行效果如图10-14所示。
4.旋转操作(rotate)动画显示
代码——04100404_Animation(旋转)
【例10-16】定义布局管理器 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-17]定义Activity程序
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
/**
* 旋转操作(rotate)动画显示
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
RotateAnimation rotate = new RotateAnimation(
0,360,// 旋转角度
Animation.RELATIVE_TO_PARENT, 0.5f,// X轴位置为半个屏幕宽度
Animation.RELATIVE_TO_PARENT, 0.0f);// Y轴从原点计算
rotate.setDuration(3000);// 3秒完成动画
set.addAnimation(rotate);// 增加动画
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
本程序使用旋转效果,图片以父控件为参考进行360°的旋转操作,而父控件的旋转中心为X轴的一半(Animation.RELATIVE_TO_PARENT,0.5f)、Y轴的原点(Animation.RELATIVE_TO_PARENT,0.0f), 旋转的操作分析如图10-15所示,本程序的运行效果如图10-16所示。
5.多个动画效果叠加显示
代码——04100405_Animation(动画叠加)
以上4个程序都只是设置了一个单一的动画效果,细心的读者可以发现,AnimationSet本身表示的是一个动画集,那么就意味着可以同时设置多个动画效果,下面的程序将定义平移及缩放动画效果。
【例10-18】定义布局文件 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-19】定义Activity程序,进行动画效果叠加
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
/**
*多个动画效果疊加显示
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
TranslateAnimation tran = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,// X轴开始位置
Animation.RELATIVE_TO_SELF, 0.5f,// X轴结束位置
Animation.RELATIVE_TO_SELF, 0.0f,// Y轴开始位置
Animation.RELATIVE_TO_SELF, 1.5f);// Y轴结束位置
ScaleAnimation scale = new ScaleAnimation(
1, 0.0f,// X轴从满屏缩小到无
1, 0.0f,// Y轴从满屏缩小到无
Animation.RELATIVE_TO_SELF, 0.5f,// 自身0.5宽度为轴缩放
Animation.RELATIVE_TO_SELF, 0.5f);// 自身0.5高度为轴缩放
scale.setRepeatCount(3);// 动画重复3次
set.addAnimation(tran);// 增加动画
set.addAnimation(scale);// 增加动画
set.setDuration(3000);// 动画持续时间为3秒
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
本程序在AnimationSet中增加了两个动画效果:平移动画(TranslateAnimation)和缩放动画(ScaleAnimation), 而这些动画的持续时间直接通过AnimationSet指定为3秒,程序的运行效果如图10-17所示。
10.4.2 定义动画速率:Interpolator
在之前的程序代码中可以发现,每当实例化AnimationSet类对象时都会定义如下一个构造方法:
AnimationSet set = new AnimationSet(true);// 定义一个动画集
在该构造方法中要传递一个boolean型的数据,而且其值设置为true。实际上该boolean型的数据就是定义的interpolator,即动画的执行速率,将其设置为true,表示所有的速率将交给AnimationSet对象统一设置,而各个不同的动画中的速率效果不起作用:反之,则为false。
在Android中,使用 android.view.animation.Interpolator 接口定义动画速率,在 Interpolator 接口中定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等,这些分别由不同的子类所实现,Interpolator接口的常用子类如表10-14所示。
表10-14 Interpolator接口的常用子类
1.定义动画速率Interpolator
代码——04100406_Animation(控制速率)
下面通过一个具体的代码观察如何设置动画的执行速率。
【例10-20】 定义布局管理器——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-21】定义Activity程序,控制速率
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
/**
* 通过一个具体的代码观察如何设置动画的执行速率
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet set = new AnimationSet(true);// 定义一个动画集
TranslateAnimation tran = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,// X轴开始位置
Animation.RELATIVE_TO_SELF, 0.5f,// X轴结束位置
Animation.RELATIVE_TO_SELF, 0.0f,// Y轴开始位置
Animation.RELATIVE_TO_SELF, 1.5f);// Y轴结束位置
ScaleAnimation scale = new ScaleAnimation(
1, 0.0f,// X轴从满屏缩小到无
1, 0.0f,// Y轴从满屏缩小到无
Animation.RELATIVE_TO_SELF, 0.5f,// 自身0.5宽度为轴缩放
Animation.RELATIVE_TO_SELF, 0.5f);// 自身0.5高度为轴缩放
scale.setRepeatCount(3);// 动画重复3次
set.setInterpolator(new AccelerateInterpolator());// 逐步加速
set.addAnimation(tran);// 增加动画
set.addAnimation(scale);// 增加动画
set.setDuration(2000);// 动画持续时间为2秒
MyAnimationDemo.this.mldn.startAnimation(set);// 启动动画
}
}
}
本程序釆用逐步加速(Acceleratelnterpolator类)的方式完成每次动画速率的变化,但是该效果不容易观察,读者可以根据自己的眼力对编写好的代码进行测试。
10.4.3 动画监听器:AnimationListener
在进行动画的操作过程中,也可以对动画的一些操作状态进行监听,如动画的启动、重复执行和结束。在 Android 系统中专门提供了一个 android.view.animation.Animation.AnimationListener 接口,用于完成动画的监听操作,在此接口中定义了3个监听动画的操作方法,如表10-15所示。
表 10-15 AnimationListener接口定义的方法
1.动画监听器AnimationListener
代码——04100407_Animation(动画监听)
下面通过一个程序演示AnimationListener的使用,本程序的主要功能是在动画开始时增加一个渐变的动画效果,并且在动画结束时删除产生动画的组件。
【例10-22】定义布局管理器——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-23】定义Activity程序,使用动画监听,进行动画操作
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
/**
* 动画监听:
* 通过一个程序演示AnimationListener的使用,
* 本程序的主要功能是在动画开始时增加一个渐变的动画效果,
* 并且在动画结束时删除产生动画的组件
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;// 定义图片视图
private ViewGroup group = null;// 定义ViewGroup对象
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.group = (ViewGroup) super.findViewById(R.id.layout);// 取得布局管理器
AnimationSet set = new AnimationSet(true);// 定义一个动画集
TranslateAnimation tran = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,// X轴开始位置
Animation.RELATIVE_TO_SELF, 0.5f,// X轴结束位置
Animation.RELATIVE_TO_SELF, 0.0f,// Y轴开始位置
Animation.RELATIVE_TO_SELF, 1.5f);// Y轴结束位置
tran.setDuration(3000);// 3秒完成动画
set.addAnimation(tran);// 增加动画
set.setAnimationListener(new AnimationListenerImpl());// 设置监听
this.mldn.startAnimation(set);// 启动动画
}
private class AnimationListenerImpl implements AnimationListener {
@Override
public void onAnimationEnd(Animation animation) {// 动画结束时触发
MyAnimationDemo.this.group
.removeView(MyAnimationDemo.this.mldn);// 动画结束后组件消失
}
@Override
public void onAnimationRepeat(Animation animation) {// 动画重复执行时触发
}
@Override
public void onAnimationStart(Animation animation) {// 动画开始时触发
if(animation instanceof AnimationSet) {// 判断类型
AnimationSet set = (AnimationSet) animation ;
AlphaAnimation alpha = new AlphaAnimation(1, 0);// 完全显示-->完全透明
alpha.setDuration(3000);// 3秒完成动画
set.addAnimation(alpha);// 增加动画
}
}
}
}
在本程序中首先定义了一个平移动画的操作,而在动画启动时又为动画増加了一个渐变的操作效果,当动画结束之后,直接将图片组件从布局管理器上删除,程序的运行效果如图10-18所示。
10.4.4 通过XML文件配置动画
通过10.4.3节中的代码演示读者应该对4种动画的操作类有所了解,在Android开发中,除了可以通过代码实现动画的配置外,也可以通过XML文件进行配置,这样就使得用户在不修改程序的情况下实现对动画的控制,以达到有效的程序与配置相分离。在Android系统中,所有定义好的XML文件都要求保存在res\anim文件夹中,在定义动画的XML文件时,可以使用表10-16 定义的动画效果元素进行配置。
提示:建议使用配置文件完成
对于组件的动画操作,建议采用配置文件的方式完成,这样对于程序的维护要比直接在 程序中编码实现好许多,也符合MVC设计模式的做法.
表10-16可定义的动画效果元素
除了表10-16中定义的元素之外,在这些元素中可以配置的公共Tweened Animation属性如:表10-17所示
表10-17可以配置的公共属性
除了表10-17列出的一些公共的动画元素配置属性外,各个动画模式也有自己的配置属性, 为了读者理解、浏览方便,分别在表10-18〜表10-21中列出了<alpha>、<scale>、<translate>和<rotate>节点的属性。
提示:配置的4个动画属性与构造方法中传递的参数是一样的。
在表10-18~表10-21中所列出的各个动画的配置属性与这些动画类的构造方法中定义的参数作用是一样的,不清楚的读者可以通过查询文档了解。
表10-18 <alpha>节点的属性
表10-19 <scale>节点的属性
表10-20 <translate>节点的属性
表10-21 <rotate>节点的属性
由于现在所有的配置文件都通过XML文件进行保存,那么所有定义的XML文件都会自动在R.java文件中进行注册,并会为每一个配置文件分配一个唯一的ID编号,这样做可以方便地在Activity程序中进行读取,而要想在Activity程序中读取这些配置,则需要使用android.view.animation.AnimationUtils 类完成,AnimationUtils 类的常用方法如表10-22 所示。
表10-22 AnimationUtils类的常用方法
下面通过几组操作具体演示如何通过配置文件完成动画的操作配置,当然程序还是以渐变、 缩放、平移、旋转为主。
1.通过XML配置渐变操作
代码——04100408_Animation配置xml实现(渐变)
【例10-24】定义res\anim\alpha.xml文件,定义渐变操作配置
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="3000" />
<!--
set//定义一个动画集
alpha //定义渐变动画
android:fromAlpha="1.0"//动画开始的alpha值,1表示不透明
android:toAlpha="0.0"//alpha值,0表示完全透明
android:duration="3000"//动画持续的时间为3秒
-->
</set>
本配置文件定义了一个<alpha>元素,其中分别定义了alpha值的变化范围以及动画的持续时间
【例10-25】定义布局管理器——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-26】定义Activity程序,读取alpha.xml文件
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
/**
*通过XML配置渐变操作
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView mldn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.mldn = (ImageView) super.findViewById(R.id.mldn);// 取得组件
this.mldn.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Animation anim = AnimationUtils.loadAnimation(
MyAnimationDemo.this, R.anim.alpha);// 读取动画配置文件
MyAnimationDemo.this.mldn.startAnimation(anim);// 启动动画
}
}
}
本程序直接利用AnimationUtils进行alpha.xml动画配置文件的读取,而程序的运行效果与图10-10一致。
2.通过XML配置缩放操作
代码——04100409_Animation配置xml实现(缩放)
【例10-27】定义缩放动画配置文件——res\anim\scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="100"
android:repeatCount="3"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
scale//定义缩放动画效果
android:fromXScale="1.0"//组件从X轴满屏显示开始
android:toXScale="0.0"//组件缩小到无
android:fromYScale="1.0"//组件从丫轴满屏显示开始
android:toYScale="0.0"//组件缩小到无
android:pivotX="50%"//以自身0.5宽度为轴缩放
android:pivotY="50%"//以自身0.5高度为轴缩放
android:startOffset="100"//动画间隔0.1秒
android:repeatCount="3"//缩放动画重复3次
android:duration="3000"//动画持续时间为3秒
-->
【例10-28】定义布局管理器——main.xml(考虑到篇幅以后不再重复列出)
(此布局文件与之前讲解的布局文件内容一样, 考虑到篇幅以后不再重复列出)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/mldn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/mldn" />
</LinearLayout>
【例10-29】定义Activity程序,读取动画配置(部分代码)
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Animation anim = AnimationUtils.loadAnimation(
MyAnimationDemo.this, R.anim.scale);// 读取动画配置文件
MyAnimationDemo.this.mldn.startAnimation(anim);// 启动动画
}
}
由于程序是通过配置文件进行读取的,所以在本Activity程序中只是更改了配置文件的资源 ID,而后面的Activity程序代码都不会改变(以后不再重复列出,可以通过源码査找)。本程序的运行效果与图10-12一致。
3.通过XML配置平移操作
代码——04100410_Animation配置xml实现(平移)
【例10-30】定义平移动画的配置文件 res\anim\translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0.0"
android:toXDelta="50%"
android:fromYDelta="0.0"
android:toYDelta="150%"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
translate//平移动画
android:fromXDelta="0.0"//动画开始的X轴位置
android:toXDelta="50%"//动画结束的长度为组件的50%
android:fromYDelta="0.0"//动画开始的丫轴位置
android:toYDelta="150%"//动画结束的长度为组件的150%
android:duration="3000"//动画持续时间为 3 秒
-->
在本配置文件中使用<translate>元素作为平移的动画效果,所有的坐标位置改变以图片的宽度和高度为参考,程序的运行效果如图10-14所示。
4.通过XML配置旋转操作
代码——04100411_Animation配置xml实现(旋转)
【例10-31】定义旋转动画的配置文件 res\anim\rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0.0"
android:toDegrees="+360.0"
android:pivotX="50%p"
android:pivotY="0%p"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
rotate//定义一个旋转动画
android:fromDegrees="0.0"//动画开始角度
android:toDegrees="+360.0"//动画结束角度
android:pivotX="50%p"//相对于父控件的50%宽,其中p表示parent
android:pivotY="0%p"//相对于父控件的0%高
android:duration="3000"//动画持续时间为3秒
-->
在本程序中由于要以父控件的X轴、Y轴为参考,所以在设置时增加了一个字母“P”,表示以父控件为参考,如果用户不希望以父控件为参考,而以控件自身的50%为参考,则直接编写50%即可,或者直接以一个绝对位置的坐标数值表示,程序的运行效果如:图10-16所示。
5.通过XML配置多种动画操作
代码——04100412_Animation配置xml实现(动画叠加)
之前所介绍的都属于单一的动画操作,实际上在一个Animation的开发之中,可以进行多个动画的操作,而这些操作可以直接在配置文件中完成,下面编写一个既可以进行平移,又可以进行缩放的动画配置文件。
【例10-32】定义平移及缩放的动画配置文件——res\anim\all.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0.0"
android:toXDelta="50%"
android:fromYDelta="0.0"
android:toYDelta="150%"
android:duration="3000"/>
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="100"
android:repeatCount="3"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
translate//平移动画
android:fromXDelta="0.0"//动画开始的X轴位置
android:toXDelta="50%"//动画结束的长度为组件的50%
android:fromYDelta="0.0"//动画开始的丫轴位置
android:toYDelta="150%"//动画结束的长度为组件的150%
android:duration="3000"//动画持续时间为 3 秒
scale//定义缩放动画效果
android:fromXScale="1.0"//组件从X轴满屏显示开始
android:toXScale="0.0"//组件缩小到无
android:fromYScale="1.0"//组件从丫轴满屏显示开始
android:toYScale="0.0"//组件缩小到无
android:pivotX="50%"//以自身0.5宽度为轴缩放
android:pivotY="50%"//以自身0.5高度为轴缩放
android:startOffset="100"//动画间隔0.1秒
android:repeatCount="3"//缩放动画重复3次
android:duration="3000"//动画持续时间为3秒
-->
本程序同时配置了两个动画元素:translate和scale,这样动画在显示时会将这两种效果进行叠加,本程序的运行效果如图10-19所示。
本程序配置文件中包含了两个动画效果,所以应该是一个动画集合(AnimationSet),观察以下程序代码:
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Animation anim = AnimationUtils.loadAnimation(
MyAnimationDemo.this, R.anim.all);// 读取动画配置文件
MyAnimationDemo.this.mldn.startAnimation(anim);// 启动动画
}
}
其中,AnimationUtils.loadAnimation()方法读取出来的动画配置的对象类型为Animation,所以直接使用Animation类的对象进行接收,但实际上此时返回的是AnimationSet,而且AnimationSet 也是Animation的子类。
6.通过配置文件控制动画速率
代码——04100413_Animation配置xml实现(控制速率)
通过配置文件也可以对速率进行配置,下面将配置多个动画,并且所有的动画将釆用增速的速率配置。
【例10-33】定义速率的配置文件——res\anim\all.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<translate
android:fromXDelta="0.0"
android:toXDelta="50%"
android:fromYDelta="0.0"
android:toYDelta="150%"
android:duration="3000"/>
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="100"
android:repeatCount="3"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
android:interpolator="@android:anim/accelerate_interpolator"//定义速率为増速
android:shareInterpolator="true"//所有动画共享此速率配置
translate//平移动画
android:fromXDelta="0.0"//动画开始的X轴位置
android:toXDelta="50%"//动画结束的长度为组件的50%
android:fromYDelta="0.0"//动画开始的丫轴位置
android:toYDelta="150%"//动画结束的长度为组件的150%
android:duration="3000"//动画持续时间为 3 秒
scale//定义缩放动画效果
android:fromXScale="1.0"//组件从X轴满屏显示开始
android:toXScale="0.0"//组件缩小到无
android:fromYScale="1.0"//组件从丫轴满屏显示开始
android:toYScale="0.0"//组件缩小到无
android:pivotX="50%"//以自身0.5宽度为轴缩放
android:pivotY="50%"//以自身0.5高度为轴缩放
android:startOffset="100"//动画间隔0.1秒
android:repeatCount="3"//缩放动画重复3次
android:duration="3000"//动画持续时间为3秒
-->
本程序在<set>元素上进行了动画速率的配置,釆用的动画速率为增速(accelerate_ interpolator),而所有的动画效果都共享这一配置的速率(android:sharelnterpolator="truen)。
10.4.5 Frame Animation
代码——04100414_帧动画(具体自己运行看效果)
Frame Animation的主要功能是采用帧的方式进行动画效果的编排,所有动画会按照事先定义好的顺序执行,而后像电影那样展现给用户,如果想使用这种动画,则需要利用android.graphics.drawable.AnimationDrawable 类进行处理,AnimationDrawable 类的常用方法如表 10-23 所示。
表10-23 AnimationDrawable类的常用方法
对于Frame Animation动画,也可以在XML文件中进行配置,同样需要将配置文件保存在 res\anim文件夹中,但是此配置文件的根节点为<animation-list>,其中包含多个<item>元素,用于定义每一帧动画,其可以配置的属性如表10-24所示。
【例10-34】 定义一个动画配置资源——res\anim\allface.xml
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@drawable/face_01"
android:duration="200" />
<item
android:drawable="@drawable/face_02"
android:duration="200" />
<item
android:drawable="@drawable/face_03"
android:duration="200" />
<item
android:drawable="@drawable/face_04"
android:duration="200" />
<item
android:drawable="@drawable/face_05"
android:duration="200" />
<item
android:drawable="@drawable/face_06"
android:duration="200" />
<item
android:drawable="@drawable/face_07"
android:duration="200" />
<item
android:drawable="@drawable/face_08"
android:duration="200" />
</animation-list>
<!--
animation-list//定义动画集合
android:oneshot="true"//默认为显示一次,true为显示一次,false为重复显示
item//定义动画帧
android:drawable="@drawable/face_01"//引入的图片资源
android:duration="200"//动画持续时间为0.2秒
-->
本程序使用<item>定义了多个动画帧,而每一个动画帧都显示一张图片(图片资源保存在drawable-hdpi目录下),每帧动画的持续时间为0.2秒。
【例10-35】定义布局文件,操作动画main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/face"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始动画"/>
</LinearLayout>
【例10-36】定义Activity程序,操作帧动画
package org.lxh.demo;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
/**
* 定义Activity程序,操作帧动画
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private ImageView face = null;// 图片组件
private Button start = null;// 按钮组件
private AnimationDrawable draw = null;// 动画操作
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.face = (ImageView) super.findViewById(R.id.face);// 取得图片
this.start = (Button) super.findViewById(R.id.start);// 取得按钮
this.start.setOnClickListener(new OnClickListenerImpl());// 设置监听
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
MyAnimationDemo.this.face
.setBackgroundResource(R.anim.allface);// 设置动画资源
MyAnimationDemo.this.draw = (AnimationDrawable)
MyAnimationDemo.this.face
.getBackground();// 取得背景的Drawable
// 动画执行次数。默认为显示一次,true为显示一次,false为重复显示
MyAnimationDemo.this.draw.setOneShot(true);
MyAnimationDemo.this.draw.start();// 开始动画
}
}
}
本程序首先通过setBackgroundResource()方法取得了动画的配置文件资源,之后又通过 getBackground()方法取得了组件的Drawable对象,随后通过AnimationDrawable提供的start()方法进行动画的启动。由于本程序是动画显示,读者可以自行实验以观察程序的运行效果。
10.4.6 LayoutAnimationController 组件
LayoutAnimationController表示不在 Layout 组件上使用动画的操作效果。例如:在进行图片列表显示时增加一些动画效果,或者是使用ListView增加一些动画效果等,而所增加的动画效果就是之前所使用的渐变、缩放、旋转、平移。与之前的动画操作一样,LayoutAnimationController 可以通过配置文件完成,也可以利用程序代码完成,下面先使用配置文件的方式完成。
本次列举两个操作的范例:一个使用GridView组件进行图片列表的动画显示;另外一个使用ListView组件进行数据列表的动画显示。
1.在GridView组件上使用动画效
代码——04100415_LayoutAnimationController(GridView)
【例10-37】定义动画配置文件——res\anim\anim_set.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="3000" />
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="100"
android:repeatCount="3"
android:duration="3000"/>
</set>
<!--
set//定义一个动画集
alpha //定义渐变动画
android:fromAlpha="1.0"//动画开始的alpha值,1表示不透明
android:toAlpha="0.0"//alpha值,0表示完全透明
android:duration="3000"//动画持续的时间为3秒
scale//定义缩放动画效果
android:fromXScale="1.0"//组件从X轴满屏显示开始
android:toXScale="0.0"//组件缩小到无
android:fromYScale="1.0"//组件从丫轴满屏显示开始
android:toYScale="0.0"//组件缩小到无
android:pivotX="50%"//以自身0.5宽度为轴缩放
android:pivotY="50%"//以自身0.5高度为轴缩放
android:startOffset="100"//动画间隔0.1秒
android:repeatCount="3"//缩放动画重复3次
android:duration="3000"//动画持续时间为3秒
-->
本配置文件与之前的动画配置文件一样,一共配置了渐变和缩放两个动画的叠加操作,而后该动画的配置文件需要在LayoutAnimationController 的配置文件中使用。
【例10-38】配置 LayoutAnimationController 的配置文件 res\anim\layout_animation.xml
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="random"
android:animation="@anim/anim_set" />
<!--
layoutAnimation//配置 LayoutAnimationController
android:delay="0.5"//动画间隔为 0.5 秒
android:animationOrder="random"//动画随机执行
android:animation="@anim/anim_set"//引用的动画配置文件
-->
在本文件中主要配置LayoutAnimationController的相关定义,在此配置中有4个可选的配置属性,介绍如下:
android:delay:多个动画间的间隔时间,此处设置的单位为秒。
android:animationOrder:表示动画的执行顺序,有3种可选顺序。
- normal:按照顺序从头到尾依次执行动画。
- reverse:按照逆序的方式依次执行每一个动画。
- random:随机执行动画。
android:animation:表示要引入的动画配置文件,此时引入的配置文件是之前所讲解的anim_set.xml
android:interpolator:配置动画的执行速率。
由于本程序是在GridView组件上应用的动画效果,所以在使用GridView组件定义图片显示之前首先需要完成一个内容显示的适配器程序。
【例10-39】定义GridView显示的图片适配器——ImageAdapter.java
package org.lxh.demo;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
/**
* 定义GridView显示的图片适配器
* @author luminal
*/
public class ImageAdapter extends BaseAdapter {
private List<Integer> picRes = new ArrayList<Integer>() ;
private Context myContext = null ;
public ImageAdapter(Context c) {
this.myContext = c;
this.initPic();// 将所有的图片资源ID读取进来
}
public int getCount() {
return this.picRes.size();
}
public Object getItem(int position) {
return this.picRes.get(position);
}
public long getItemId(int position) {
return this.picRes.get(position).intValue();
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView img = new ImageView(this.myContext);
img.setBackgroundColor(0xFF000000);
img.setImageResource(this.picRes.get(position));// 给ImageView设置资源
img.setScaleType(ImageView.ScaleType.CENTER);// 居中显示
img.setLayoutParams(new GridView.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));// 布局参数
img.setPadding(3, 3, 3, 3);// 左、上、右、下边距
return img;
}
//将所有的图片资源ID读取进来
public void initPic(){
Field[] fields = R.drawable.class.getDeclaredFields();
for (int x = 0; x < fields.length; x++) {
if (fields[x].getName().startsWith("png_")){// 所有png_*命名的图片
try {// 保存图片ID
this.picRes.add(fields[x].getInt(R.drawable.class));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
本程序继续使用第7章讲解Gridview组件时所使用的24张生肖图片,所有的图片都是以“ png_* ”的形式命名的。
【例10-40】定义布局管理器 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
android:numColumns="3"//毎行显示3个组件
android:stretchMode="columnWidth"//缩放时与列的宽度保持一
//LayoutAnimationController 配置
android:layoutAnimation="@anim/layout_animation"
-->
<GridView
android:id="@+id/myGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="3"
android:stretchMode="columnWidth"
android:layoutAnimation="@anim/layout_animation"/>
</LinearLayout>
本程序在GridView组件上使用android:layoutAnimation属性表示此组件显示时,所需要引入的layout动画,而该layout动画就是为之前所配置的layout_animation.xml文件。
【例10-41】定义Activity程序显示图片
package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
/**
* 在GridView组件上使用动画效果
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private GridView myGridView = null;// 定义网格视图
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);// 调用默认布局
this.myGridView = (GridView) super.findViewById(R.id.myGridView) ;
this.myGridView.setAdapter(new ImageAdapter(this));// 设置适配器、显示图片
}
}
由于所有显示图片的数据信息都封装在ImageAdapter类中,所以本程序直接将ImageAdapter 类的对象设置在GridView组件中,而在执行时,就会按照配置实现动画效果,程序的运行效果如图10-20所示。
2.在ListView组件中配置动画效
代码——04100416_LayoutAnimationController(ListView)
ListView作为列表显示组件,在显示或更新列表项时也是可以使用动画效果完成的,下面通过一个实际的操作来观察其使用。为了简化代码,将釆用与之前同样的动画配置文件(anim_set.xml、R.layout animation.xml)。
【例10-42】定义ListView显示的布局管理器——info.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:id="@+id/id"
android:textSize="16px"
android:layout_height="wrap_content"
android:layout_width="100px"/>
<TextView
android:id="@+id/data"
android:textSize="16px"
android:layout_height="wrap_content"
android:layout_width="200px"/>
</TableRow>
</TableLayout>
<!--
TableLayout//表格布局管理器
TableRow//表格行
-->
本配置文件主要完成ListView中每一行数据的显示,所以使用了表格布局管理器,而其中的文本显示组件中设置的ID就是以后在Activity程序中与Map数据相匹配的标记。
【例10-43】定义布局管理器——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
//引入的动画配置文件
android:layoutAnimation="@anim/layout_animation"
-->
<ListView
android:id="@+id/myListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/layout_animation" />
</LinearLayout>
在本配置文件中配置了一个ListView组件,与之前定义GridView组件一样,使用android: layoutAnimation属性来指定动画的配置文件。
【例10-44】 编写Activity程序,在ListView上显示信息
package org.lxh.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* 在ListView组件中配置动画效果
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private String idData[] = new String[] { "mldn", "lxh",
"bbs", "javajob" };// 显示ID
private String titleData[] = new String[] { "魔乐科技", "李 兴 华", "魔乐社区",
"招 聘 网" };// 显示数据
private SimpleAdapter simple = null;// 数据适配器
private ListView myListView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.myListView = (ListView) super.findViewById(R.id.myListView) ;
List<Map<String,Object>> all = new ArrayList<Map<String,Object>>() ;
Map<String, Object> map = null;// 保存多组数据
for (int x = 0; x < this.idData.length; x++) {// 循环设置内容
map = new HashMap<String, Object>();// 实例化Map对象
map.put("id", this.idData[x]);// 设置显示图片
map.put("data", this.titleData[x]);// 设置显示标题
all.add(map);// 保存map
}
this.simple = new SimpleAdapter(
this,// 将数据包装
all,// 数据集合
R.layout.info,// 显示的布局管理器
new String[] { "id", "data"},// 匹配的Map集合的KEY
new int[] { R.id.id, R.id.data});// 配置显示数据
this.myListView.setAdapter(this.simple);// 设置数据
}
}
本程序的主要功能是将所有需要显示的数据保存在一个SimpleAdapter对象中进行封装,
并在ListView上显示,程序的运行效果如图10-21所示。
代码——04100417_LayoutAnimationController(ListView编码实现动画)
以上两个范例都是直接在组件上应用了配置好的LayoutAnimationController动画,实际上对于LayoutAnimationController动画,也可以采用编码的形式出现。在进行操作之前,首先来看 android.view.animation.LayoutAnimationController 类的相关方法及常量,如表 10-25 所示。
下面将修改之前ListView显示数据的操作,所有动画效果通过代码设置。在本程序中不再需要layout_animation.xml文件,此文件的功能将直接使用LayoutAnimationController类实现,而本程序所使用的动画效果依然是anim_set.xml配置的内容
【例10-45】定义布局管理器——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/myListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
在本配置文件中,将最早配置在ListView组件中的android:layoutAnimation属性删除,其他配置与之前相同。
【例10-46】定义 Activity 程序,手工配置 LayoutAnimationController
package org.lxh.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* 定义 Activity 程序,手工配置 LayoutAnimationController
* @author luminal
*/
public class MyAnimationDemo extends Activity {
private String idData[] = new String[] { "mldn", "lxh",
"bbs", "javajob" };// 显示ID
private String titleData[] = new String[] { "魔乐科技", "李 兴 华", "魔乐社区",
"招 聘 网" };// 显示数据
private SimpleAdapter simple = null;// 数据适配器
private ListView myListView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.myListView = (ListView) super.findViewById(R.id.myListView) ;
List<Map<String,Object>> all = new ArrayList<Map<String,Object>>() ;
Map<String, Object> map = null;// 保存多组数据
for (int x = 0; x < this.idData.length; x++) {// 循环设置内容
map = new HashMap<String, Object>();// 实例化Map对象
map.put("id", this.idData[x]);// 设置显示图片
map.put("data", this.titleData[x]);// 设置显示标题
all.add(map);// 保存map
}
this.simple = new SimpleAdapter(
this,// 将数据包装
all,// 数据集合
R.layout.info,// 显示的布局管理器
new String[] { "id", "data"},// 匹配的Map集合的KEY
new int[] { R.id.id, R.id.data});// 配置显示数据
this.myListView.setAdapter(this.simple);// 设置数据
Animation anim = AnimationUtils.loadAnimation(
this, R.anim.anim_set);// 读取动画配置文件
LayoutAnimationController control = new LayoutAnimationController(anim) ;
control.setDelay(0.5f);// 动画间隔
control.setOrder(LayoutAnimationController.ORDER_RANDOM);// 动画显示顺序
this.myListView.setLayoutAnimation(control);// 设置动画
}
}
在本程序中首先使用AnimationUtils读取anim_set.xml的动画配置文件,随后实例化一个 LayoutAnimationController对象,并配置动画间隔和动画的执行顺序,最后利用setLayoutAnimation() 方法添加动画。