android动画效果

前几天弄alertdialog和popupwindow的时候,用到了android的动画效果,今天专门研究了一下关于android的动画效果,列出来,方便以后使用。

Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。
第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。

在附件里面我会把这两种效果的实例代码上传上来供大家下载,现在贴在方便使用的代码。

Tween动画
Alpha ---- 淡入淡出,Scale ---- 缩放效果,Translate ---- 移动效果,Rotate ---- 旋转

Frame动画
播放一组连续的图片


alpha_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <alpha
        android:duration="3000"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" />

    <!--
  		   透明度控制动画效果 alpha
     	   浮点型值:
            fromAlpha 属性为动画起始时透明度
            toAlpha   属性为动画结束时透明度
            	说明: 
                0.0表示完全透明
                1.0表示完全不透明
         	   以上值取0.0-1.0之间的float数据类型的数字
        
     	   长整型值:
            duration  属性为动画持续时间
           		 说明:     
               	 时间以毫秒为单位

     -->

</set>


scale_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="1500"
        android:fillAfter="false"
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />

</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_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 定义从左向右进入的动画 -->
    <translate
        android:duration="1500"
        android:fromXDelta="-100%"
        android:toXDelta="0" />
    
<!-- <translate
    android:duration="2000"
    android:fromXDelta="30"
    android:fromYDelta="30"
    android:toXDelta="-80"
    android:toYDelta="300" /> -->

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


rotate_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<rotate
    android:duration="3000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="+350" />
  
<!-- 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>


Frame动画
播放一组连续的图片
drawable --- drawable_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/pq1" android:duration="50"/> 
    <item android:drawable="@drawable/pq2" android:duration="50"/> 
    <item android:drawable="@drawable/pq3" android:duration="50"/> 
    <item android:drawable="@drawable/pq4" android:duration="50"/> 
    <item android:drawable="@drawable/pq5" android:duration="50"/> 
    <item android:drawable="@drawable/pq6" android:duration="50"/> 
</animation-list> 


import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener{

	private ImageView imageView,imageView2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView = (ImageView) findViewById(R.id.anim_img);
		imageView2 = (ImageView) findViewById(R.id.anim_draw_img);
		
		findViewById(R.id.anim_alpha).setOnClickListener(this);
		findViewById(R.id.anim_scale).setOnClickListener(this);
		findViewById(R.id.anim_translate).setOnClickListener(this);
		findViewById(R.id.anim_rotate).setOnClickListener(this);
		findViewById(R.id.anim_drawable).setOnClickListener(this);
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.anim_alpha:
			if(imageView.getVisibility()==View.INVISIBLE){
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.alpha_in));
				imageView.setVisibility(View.VISIBLE);
			}else{
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.alpha_out));
				imageView.setVisibility(View.INVISIBLE);
			}
			break;
		case R.id.anim_scale:
			if(imageView.getVisibility()==View.INVISIBLE){
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.scale_in));
				imageView.setVisibility(View.VISIBLE);
			}else{
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.scale_out));
				imageView.setVisibility(View.INVISIBLE);
			}
			break;
		case R.id.anim_translate:
			if(imageView.getVisibility()==View.INVISIBLE){
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.translate_in));
				imageView.setVisibility(View.VISIBLE);
			}else{
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.translate_out));
				imageView.setVisibility(View.INVISIBLE);
			}
			break;
		case R.id.anim_rotate:
			if(imageView.getVisibility()==View.INVISIBLE){
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.rotate_in));
				imageView.setVisibility(View.VISIBLE);
			}else{
				imageView.setAnimation(AnimationUtils
						.loadAnimation(this, R.anim.rotate_out));
				imageView.setVisibility(View.INVISIBLE);
			}
			break;
		case R.id.anim_drawable:
			imageView2.setBackgroundResource(R.drawable.drawable_anim);
			AnimationDrawable animationDrawable = (AnimationDrawable) imageView2.getBackground();
//			animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq1), 50);
//			animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq2), 50);
//			animationDrawable.addFrame(getResources().getDrawable(R.drawable.pq3), 50);
			animationDrawable.start();
			break;
		default:
			break;
		}
	}

}


下面会有一个实例

猜你喜欢

转载自18767136122.iteye.com/blog/2120206