Android提供了2种动画:
1> Tween动画,通过对 View 的内容进行一系列的图形变换 (包括平移、缩放、旋转、改变透明度)来实现动画效果。动画效果的定义可以采用XML来做也可以采用编码来做。Tween动画有4种类型:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。
2> Frame动画,即顺序播放事先做好的图像,跟电影类似。开发步骤:
(1)把准备好的图片放进项目res/ drawable下。
(2)在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义。当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。
(3)为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。
本例要实现对ImageView对象进行渐变尺寸缩放动画效果
1> 在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义,如:scale.xml,内容如下:
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < scale android:interpolator ="@android:anim/accelerate_decelerate_interpolator"
4 android:fromXScale ="0.0"
5 android:toXScale ="5"
6 android:fromYScale ="0.0"
7 android:toYScale ="5"
8 android:pivotX ="50%"
9 android:pivotY ="50%"
10 android:fillAfter ="false"
11 android:duration ="5000"
12 />
13 </ set >
2 < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < scale android:interpolator ="@android:anim/accelerate_decelerate_interpolator"
4 android:fromXScale ="0.0"
5 android:toXScale ="5"
6 android:fromYScale ="0.0"
7 android:toYScale ="5"
8 android:pivotX ="50%"
9 android:pivotY ="50%"
10 android:fillAfter ="false"
11 android:duration ="5000"
12 />
13 </ set >
动画的进度使用interpolator控制,android提供了几个Interpolator 子类,实现了不同的速度曲线,如LinearInterpolator实现了匀速效果、Accelerateinterpolator实现了加速效果、DecelerateInterpolator实现了减速效果等。还可以定义自己的Interpolator子类,实现抛物线、自由落体等物理效果。
fromXScale(浮点型) 属性为动画起始时X坐标上的缩放尺寸
fromYScale(浮点型) 属性为动画起始时Y坐标上的缩放尺寸
toXScale(浮点型) 属性为动画结束时X坐标上的缩放尺寸
toYScale(浮点型) 属性为动画结束时Y坐标上的缩放尺寸
说明: 以上四种属性值
0 .0表示收缩到没有
1 .0表示正常无缩放
值小于1.0表示收缩
值大于1.0表示放大
pivotX(浮点型) 属性为动画相对于物件的X坐标的开始位置
pivotY(浮点型) 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0% - 100 %中取值
50 %为物件的X或Y方向坐标上的中点位置
duration(长整型)属性为动画持续时间 。说明: 时间以毫秒为单位
fillAfter(布尔型)属性当设置为true,该动画转化在动画结束后被应用
fromYScale(浮点型) 属性为动画起始时Y坐标上的缩放尺寸
toXScale(浮点型) 属性为动画结束时X坐标上的缩放尺寸
toYScale(浮点型) 属性为动画结束时Y坐标上的缩放尺寸
说明: 以上四种属性值
0 .0表示收缩到没有
1 .0表示正常无缩放
值小于1.0表示收缩
值大于1.0表示放大
pivotX(浮点型) 属性为动画相对于物件的X坐标的开始位置
pivotY(浮点型) 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0% - 100 %中取值
50 %为物件的X或Y方向坐标上的中点位置
duration(长整型)属性为动画持续时间 。说明: 时间以毫秒为单位
fillAfter(布尔型)属性当设置为true,该动画转化在动画结束后被应用
2> 在layout文件添加<ImageView>节点:
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="horizontal"
4 android:layout_width ="fill_parent"
5 android:layout_height ="fill_parent"
6 >
7 < ImageView
8 android:layout_width ="wrap_content"
9 android:layout_height ="wrap_content"
10 android:src ="@drawable/icon"
11 android:id ="@+id/imageView"
12 />
13 </ LinearLayout >
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="horizontal"
4 android:layout_width ="fill_parent"
5 android:layout_height ="fill_parent"
6 >
7 < ImageView
8 android:layout_width ="wrap_content"
9 android:layout_height ="wrap_content"
10 android:src ="@drawable/icon"
11 android:id ="@+id/imageView"
12 />
13 </ LinearLayout >
说明:除了可以对<ImageView>实现动画效果,其实也可以对其他View实现动画效果,如:<TextView>
3>在Activity里对ImageView使用前面定义好的动画效果:
1
public
class
AnimationActivity
extends
Activity {
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super .onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
7 // 加载动画XML文件,生成动画指令
8 Animation animation = AnimationUtils.loadAnimation( this , R.anim.scale);
9 // 开始执行动画
10 imageView.startAnimation(animation);
11 }
12 }
13
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super .onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
7 // 加载动画XML文件,生成动画指令
8 Animation animation = AnimationUtils.loadAnimation( this , R.anim.scale);
9 // 开始执行动画
10 imageView.startAnimation(animation);
11 }
12 }
13
备注:上面采用的是xml文件定义动画效果,作为代替,也可以采用编码方式实现。下面采用编码方式实现上述例子同样的效果:
1
public
class
AnimationActivity
extends
Activity {
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super .onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
7 ScaleAnimation animation = new ScaleAnimation( 0.0f , 5f, 0.0f , 5f,
8 Animation.RELATIVE_TO_SELF, 0.5f , Animation.RELATIVE_TO_SELF, 0.5f );
9 animation.setDuration( 5000 ); // 设置持续时间5秒
10 imageView.startAnimation(animation);
11 }
12 }
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super .onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
7 ScaleAnimation animation = new ScaleAnimation( 0.0f , 5f, 0.0f , 5f,
8 Animation.RELATIVE_TO_SELF, 0.5f , Animation.RELATIVE_TO_SELF, 0.5f );
9 animation.setDuration( 5000 ); // 设置持续时间5秒
10 imageView.startAnimation(animation);
11 }
12 }
===================== Frame动画例子 ===============================
(1)把准备好的图片放进项目res/ drawable下。
图片有:girl_1.gif, girl_2.gif, girl_3.gif
(2)在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义,如:frame.xml。
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < animation-list xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:oneshot ="false" >
4 < item android:drawable ="@drawable/girl_1" android:duration ="200" />
5 < item android:drawable ="@drawable/girl_2" android:duration ="200" />
6 < item android:drawable ="@drawable/girl_3" android:duration ="200" />
7 </ animation-list >
2 < animation-list xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:oneshot ="false" >
4 < item android:drawable ="@drawable/girl_1" android:duration ="200" />
5 < item android:drawable ="@drawable/girl_2" android:duration ="200" />
6 < item android:drawable ="@drawable/girl_3" android:duration ="200" />
7 </ animation-list >
上面的XML就定义了一个Frame动画,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:girl_1.gif, girl_2.gif, girl_3.gif,每帧动画持续200毫秒。android:oneshot属性如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
(3)为View控件绑定动画效果,调用代表动画的AnimationDrawable的start()方法开始动画。
1
public
class
FrameActivity
extends
Activity {
2 private AnimationDrawable animationDrawable;
3 @Override
4 public void onCreate(Bundle savedInstanceState) {
5 super .onCreate(savedInstanceState);
6 setContentView(R.layout.main);
7 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
8 imageView.setBackgroundResource(R.anim.frame);
9 animationDrawable = (AnimationDrawable) imageView.getBackground();
10 }
11 @Override
12 public boolean onTouchEvent(MotionEvent event) {
13 if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按下
14 animationDrawable.start();
15 return true ;
16 }
17 return super .onTouchEvent(event);
18 }
19 }
2 private AnimationDrawable animationDrawable;
3 @Override
4 public void onCreate(Bundle savedInstanceState) {
5 super .onCreate(savedInstanceState);
6 setContentView(R.layout.main);
7 ImageView imageView = (ImageView) this .findViewById(R.id.imageView);
8 imageView.setBackgroundResource(R.anim.frame);
9 animationDrawable = (AnimationDrawable) imageView.getBackground();
10 }
11 @Override
12 public boolean onTouchEvent(MotionEvent event) {
13 if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按下
14 animationDrawable.start();
15 return true ;
16 }
17 return super .onTouchEvent(event);
18 }
19 }
有一点需要强调的是:启动Frame动画的代码animationDrawable.start();不能应用在OnCreate()方法中,因为在OnCreate()中 AnimationDrawable还没有完全的与ImageView绑定。在OnCreate()中启动动画,只能看到第一张图片。这里在拖曳事件中实现的。