Android开发(10) 动画(Animation)

407 阅读2分钟

概述

Android SDK介绍了两种Animation:

  1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种 渐变动画 ,或者说 补间动画。
  2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画,或者说 逐帧动画。

渐变动画

4种渐变动画

alpha        渐变透明度动画效果
scale        渐变尺寸伸缩动画效果
translate  画面转换位置移动动画效果
rotate      画面转移旋转动画效果

实现动画的步骤:

1.准备一个animation对象,改对象可以看作是个动画对象,它描述(封装)了什么样式的动画。
我们可以在代码里手动创建这些对象,对应的4个animaiton对象类:

AlphaAnimation渐变透明度动画效果
ScaleAnimation渐变尺寸伸缩动画效果
TranslateAnimation画面转换位置移动动画效果
RotateAnimation画面转移旋转动画效果

XML方式

我也可以写一个描述动画的xml文件,放到资源文件的anim文件夹下。然后,在代码里加载(load)这个描述的文件:

int animationSrouceId  = 0;//资源文件的ID
Animation ani1 = AnimationUtils.loadAnimation(            
      getApplicationContext(), animationSrouceId); 
 return ani1;   

2.为view视图控件 指定 启动动画,调用startAnimation方法来完成。

     //组件播放动画 
     ImageView _imageView1;    
     _imageView1 =     (ImageView)findViewById(R.id.imageView1);     
      _imageView1.start        Animation(ani1); 

下图是我做的DEMO截图,动画的样式很难截图上来。我会在本文末尾放上源代码。

\

2044033-61fe4771badbb1e4.png

下面是xml描述的animation动画

透明alpha效果的代码:

<?xml version="1.0" encoding="utf-8"?>
<set   xmlns:android="http://schemas.android.com/apk/res/android"     >
    <alpha
          android:fromAlpha="0.3"
          android:toAlpha="1.0"
          android:duration="2000"
    /> 
<!-- 透明度控制动画效果 alpha
    浮点型值:
        fromAlpha 属性为动画起始时透明度
        toAlpha   属性为动画结束时透明度
        说明: 
            0.0表示完全透明
            1.0表示完全不透明
        以上值取0.0-1.0之间的float数据类型的数字
    
    长整型值:
        duration  属性为动画持续时间
        说明:     
            时间以毫秒为单位
  -->
</set>

旋转(rotate)

<?xml version="1.0" encoding="utf-8"?>
  <set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate 
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
      android:fromDegrees="0" 
    android:toDegrees="+350"         
    android:pivotX="50%" 
    android:pivotY="50%"     
    android:duration="3000" />  
<!-- rotate 旋转动画效果
   属性:interpolator 指定一个动画的插入器
         在我试验过程中,使用android.res.anim中的资源时候发现
         有三种动画插入器:
            accelerate_decelerate_interpolator   加速-减速 动画插入器
            accelerate_interpolator               加速-动画插入器
            decelerate_interpolator               减速- 动画插入器
         其他的属于特定的动画效果
                       
   浮点数型值:
        fromDegrees 属性为动画起始时物件的角度    
        toDegrees   属性为动画结束时物件旋转的角度 可以大于360度   

    
        说明:
                 当角度为负数——表示逆时针旋转
                 当角度为正数——表示顺时针旋转              
                 (负数from——to正数:顺时针旋转)   
                 (负数from——to负数:逆时针旋转) 
                 (正数from——to正数:顺时针旋转) 
                 (正数from——to负数:逆时针旋转)       

        pivotX     属性为动画相对于物件的X坐标的开始位置
        pivotY     属性为动画相对于物件的Y坐标的开始位置
            
        说明:        以上两个属性值 从0%-100%中取值
                     50%为物件的X或Y方向坐标上的中点位置

    长整型值:
        duration  属性为动画持续时间
        说明:       时间以毫秒为单位
  -->
  </set>

缩放(scale)

  <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <scale  
      android:interpolator=
                 "@android:anim/accelerate_decelerate_interpolator"
      android:fromXScale="0.0"
      android:toXScale="1.4"
      android:fromYScale="0.0"
      android:toYScale="1.4"
      android:pivotX="50%"
      android:pivotY="50%"
      android:fillAfter="false"
      android:duration="700" />
  </set>
  <!-- 尺寸伸缩动画效果 scale
   属性:interpolator 指定一个动画的插入器
    在我试验过程中,使用android.res.anim中的资源时候发现
    有三种动画插入器:
        accelerate_decelerate_interpolator  加速-减速 动画插入器
          accelerate_interpolator        加速-动画插入器
        decelerate_interpolator        减速- 动画插入器
    其他的属于特定的动画效果
  浮点型值:
     
        fromXScale 属性为动画起始时 X坐标上的伸缩尺寸    
        toXScale   属性为动画结束时 X坐标上的伸缩尺寸     
    
        fromYScale 属性为动画起始时Y坐标上的伸缩尺寸    
        toYScale   属性为动画结束时Y坐标上的伸缩尺寸    
    
        说明:
             以上四种属性值    

                0.0表示收缩到没有 
                1.0表示正常无伸缩     
                值小于1.0表示收缩  
                值大于1.0表示放大
    
        pivotX     属性为动画相对于物件的X坐标的开始位置
        pivotY     属性为动画相对于物件的Y坐标的开始位置
    
        说明:
                以上两个属性值 从0%-100%中取值
                50%为物件的X或Y方向坐标上的中点位置
    
    长整型值:
        duration  属性为动画持续时间
        说明:   时间以毫秒为单位

    布尔型值:
        fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
  -->

位移(translate )

  <?xml version="1.0" encoding="utf-8"?>
  <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="0"
    android:toXDelta="50"
    android:fromYDelta="0"
    android:toYDelta="50"
    android:duration="2000"
     android:fillAfter="true"  

/>

<!-- translate 位置转移动画效果
    整型值:
        fromXDelta 属性为动画起始时 X坐标上的位置    
        toXDelta   属性为动画结束时 X坐标上的位置
        fromYDelta 属性为动画起始时 Y坐标上的位置
        toYDelta   属性为动画结束时 Y坐标上的位置
        注意:
                 没有指定fromXType toXType fromYType toYType 时候,
                 默认是以自己为相对参照物             
    长整型值:
        duration  属性为动画持续时间
        说明:   时间以毫秒为单位
-->
</set>

逐帧动画演示(Frame Animation)

逐帧动画就是将多张图片按顺序展示,从而产生一种动态的效果。
效果演示:

\

2044033-817ac113f3f52336.jpg

1.准备几张连续的图片,编写动画描述文件(在anim资源文件夹下新建一个XML)。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  android:oneshot="true">   
       <item android:drawable="@drawable/c1" android:duration="200" />  
 <item android:drawable="@drawable/c2" android:duration="200" /> 
 <item android:drawable="@drawable/c3" android:duration="200" />
 <item android:drawable="@drawable/c4" android:duration="200" />
 <item android:drawable="@drawable/c5" android:duration="200" />
 <item android:drawable="@drawable/c6" android:duration="200" />
</animation-list>

2.在窗体里放置一个ImageView 控件,并在代码里编写

      _imageView1 = (ImageView)findViewById(R.id.imageView1);//放置的ImageView 控件
    
    //设置动画背景
    _imageView1.setBackgroundResource(R.anim.animation_list); //其中R.anim.animation_list就是上一步准备的动画描述文件的资源名

    //获得动画对象
    _animaition = (AnimationDrawable) _imageView1.getBackground();

3.启动动画

            _animaition.setOneShot(false); //是否仅仅启动一次?
            if(_animaition.isRunning())//是否正在运行?
            {
                _animaition.stop();//停止
            }
            _animaition.start();//启动

渐变动画-源代码下载
帧- 源代码下载

参考

www.cnblogs.com/feisky/arch…
www.eoeandroid.com/forum.php?m…