Android提供了2中动画

1.Tween动画,通过对View的内容进行一系列的图形变换(包括平移,缩放,旋转,改变透明度)来实现动画的效果,动画效果的定义可以采用XML方式也可以采用编码来做Tween动画有4种类型:

动画的类型

Xml定义动画使用的配置节点

编码定义动画使用的类

渐变透明度动画效果

<alpha/>

AlphaAnimation

渐变尺寸缩放动画效果

<scale/>

ScaleAnimation

画面位置移动动画效果

<translate/>

TranslateAnimation

画面旋转动画效果

<rotate/>

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:fromYScale="0.0"   
    6. android:toXScale="5"   
    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,该动画转化在动画结束后被应用



    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>


    说明:除了可以对<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. }



    备注:上面采用的是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. }


    其他动画效果定义例子:


    =================渐变透明度动画效果======================

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
    3. <alpha  
    4. android:fromAlpha="0.1"   
    5. android:toAlpha="1.0"  
    6. android:duration="3000"  
    7. />  
    8. </set>


    编码实现透明度动画效果:

    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. AlphaAnimation animation = new AlphaAnimation(0.1, 1.0);   
    8. animation.setDuration(5000); //设置持续时间5秒  
    9. imageView.startAnimation(animation);  
    10. }  
    11. }


    =================画面位置移动动画效果======================


    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
    3. <translate  
    4. android:repeatCount="2"  
    5. android:fromXDelta="0"  
    6. android:fromYDelta="0"  
    7. android:toXDelta="120"  
    8. android:toYDelta="120"  
    9. android:duration="3000"  
    10. />  
    11. <!-- fromXDelta fromYDelta 为动画起始时 X和Y坐标上的位置  
    12. toXDelta toYDelta为动画结束起始时 X和Y坐标上的位置  
    13. -->  
    14. </set>


    编码实现位置移动动画效果:

      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. TranslateAnimation animation = new TranslateAnimation(0, 120, 0, 120);   
      8. animation.setDuration(5000); //设置持续时间5秒  
      9. imageView.startAnimation(animation);  
      10. }  
      11. }


      =================画面旋转动画效果======================

      1. <?xml version="1.0" encoding="utf-8"?>  
      2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
      3. <rotate  
      4. android:interpolator="@android:anim/accelerate_interpolator"  
      5. android:repeatCount="2"  
      6. android:fromDegrees="0"  
      7. android:toDegrees="+360"  
      8. android:pivotX="50%"  
      9. android:pivotY="50%"  
      10. android:duration="3000"  
      11. />  
      12. <!--   
      13. repeatCount 重复次数  
      14. fromDegrees为动画起始时物件的角度:  
      15. 当角度为负数——表示逆时针旋转  
      16. 当角度为正数——表示顺时针旋转  
      17. (负数fromDegrees——toDegrees正数:顺时针旋转)  
      18. (负数fromDegrees——toDegrees负数:逆时针旋转)  
      19. (正数fromDegrees——toDegrees正数:顺时针旋转)  
      20. (正数fromDegrees——toDegrees负数:逆时针旋转)  
      21. toDegrees属性为动画结束时物件旋转的角度 可以大于360度  
      22. pivotX,pivotY 为动画相对于物件的X、Y坐标的开始位.说明:以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置  
      23. -->  
      24. </set>



      编码实现:

      1. RotateAnimation animation = new RotateAnimation(0, -90, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  
      2. animation.setDuration(500);  
      3. imageView.startAnimation(animation);





      ===================== 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>


        上面的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. }


        有一点需要强调的是:启动Frame动画的代码animationDrawable.start();不能应用在OnCreate()方法中,因为在OnCreate()中 AnimationDrawable还没有完全的与ImageView绑定。在OnCreate()中启动动画,只能看到第一张图片。这里在触摸事件中实现的。