首页 > 代码库 > android动画-动画分类及代码示例

android动画-动画分类及代码示例

原来一直对动画一知半解,只知道按照网上的方法会用就行了,但是自己写起来感觉确实有点费劲,今天终于研究了代码实现,一下子感觉清晰多了。先把总结如下,代码中有详细的注释。

动画分类

   1.Peoperty Animation

      这个动画是Android3.0之后推出的目前用处不大。

   2.View Animation

       这类动画也叫tween animation 主要分为 渐变动画(AlphaAnimation)旋转动画(RotateAnimation)

缩放动画(ScaleAnimation)位移动画(TranslateAnimation)

 3.Drawable Animation

      这类动画也叫帧动画 FrameAnimation


先上tween animation

MainActivity.java

package com.example.testanimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView imgView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		imgView = (ImageView)this.findViewById(R.id.imgView) ;
		Button btnAlpha = (Button)this.findViewById(R.id.btnAlpha) ;
		btnAlpha.setOnClickListener(new AnimationOnClickListener(AnimationType.alpha));
		Button btnRotate = (Button)this.findViewById(R.id.btnRotate) ;
		btnRotate.setOnClickListener(new AnimationOnClickListener(AnimationType.rotate));
		Button btnTraslate = (Button)this.findViewById(R.id.btnTraslate) ;
		btnTraslate.setOnClickListener(new AnimationOnClickListener(AnimationType.traslate));
		Button btnScale = (Button)this.findViewById(R.id.btnScale) ;
		btnScale.setOnClickListener(new AnimationOnClickListener(AnimationType.scale));
		Button btnComplex = (Button)this.findViewById(R.id.btnComplex) ;
		btnComplex.setOnClickListener(new AnimationOnClickListener(AnimationType.complex));
		
		
	}
	
	enum AnimationType {
		alpha,
		rotate,
		traslate,
		scale,
		complex
	}
	
	class AnimationOnClickListener implements OnClickListener {
		
		private AnimationType mAnimationType;
		
		public AnimationOnClickListener (AnimationType animationType) {
			this.mAnimationType = animationType;
		}
		
		@Override
		public void onClick(View v) {
			switch (mAnimationType) {
			case alpha:
				/**
				 * 透明度从不透明变为0.2透明度
				 */
				AlphaAnimation _alphaAnimation = new AlphaAnimation(1.0f, 0.2f);
				_alphaAnimation.setDuration(200);
				_alphaAnimation.setFillAfter(true);//动画执行完的状态显示
				imgView.startAnimation(_alphaAnimation);
				break;
			case rotate:
				/**
				 * RotateAnimation 以图片中点为圆心旋转360度
				 * params:
				 * pivotXType 中心点x坐标类型 RELATIVE_TO_SELF相对于自己,RELATIVE_TO_PARENT相对于父view
				 * pivotYType 同上
				 * 
				 * pivotXValue,pivotYValue(圆心)
				 * 
				 */
				RotateAnimation _rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
				_rotateAnimation.setDuration(3000);
//				_rotateAnimation.setRepeatMode(Animation.REVERSE);
				imgView.startAnimation(_rotateAnimation);
				break;
			case traslate:
				/**
				 * 按照图片的宽高2倍的位移移动
				 */
				TranslateAnimation _translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 2f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 2f);
				_translateAnimation.setDuration(3000);
				_translateAnimation.setFillAfter(true);
				imgView.startAnimation(_translateAnimation);
				break;
			case scale:
				/**
				 * ScaleAnimation 以图片左上角为静止点,按照1.5倍尺寸放大
				 * params:
				 * pivotXType 中心点x坐标类型 RELATIVE_TO_SELF相对于自己,RELATIVE_TO_PARENT相对于父view
				 * pivotYType 同上
				 * pivotXValue,pivotYValue(静止点)
				 */
				ScaleAnimation _scaleAnimation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_SELF, 0f);
				_scaleAnimation.setDuration(300);
				_scaleAnimation.setZAdjustment(Animation.ZORDER_TOP);
				_scaleAnimation.setRepeatCount(1);
				_scaleAnimation.setRepeatMode(Animation.REVERSE);//必须设置setRepeatCount此设置才生效,动画执行完成之后按照逆方式动画返回
				imgView.startAnimation(_scaleAnimation);
				break;
			case complex:
				AnimationSet _animationSet = new AnimationSet(false);
				AlphaAnimation _alphaAnimation2 = new AlphaAnimation(1.0f, 0.2f);
				_alphaAnimation2.setDuration(1000);
				_alphaAnimation2.setRepeatCount(1);
				_alphaAnimation2.setRepeatMode(Animation.REVERSE);
//				_alphaAnimation2.setFillAfter(true);//设此地方不好使,必须设置到AnimationSet中
				
				
				TranslateAnimation _translateAnimation2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 2f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 2f);
				_translateAnimation2.setDuration(1000);
				_translateAnimation2.setRepeatCount(1);
				_translateAnimation2.setRepeatMode(Animation.REVERSE);
//				_translateAnimation2.setFillAfter(true);
				
				_animationSet.addAnimation(_alphaAnimation2);
				_animationSet.addAnimation(_translateAnimation2);
				_animationSet.setFillAfter(true);
//				_animationSet.setRepeatCount(1);
//				_animationSet.setRepeatMode(Animation.REVERSE);//这两个属性设此地不好使,必须单个设置
				
				imgView.startAnimation(_animationSet);
				break;

			default:
				break;
			}
			
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imgView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src=http://www.mamicode.com/"@drawable/ic_launcher" />>
下面为frame animation

public class FrameAnimationAcitvity extends Activity {
	private ImageView imageView;
	private AnimationDrawable ad;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.animation_list);
    	Button button=(Button)findViewById(R.id.button1);
    	imageView=(ImageView)findViewById(R.id.imageView1);
    	imageView.setBackgroundResource(R.drawable.framedrawable);
    	ad=(AnimationDrawable)imageView.getBackground();
    	button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
                  	ad.start();			
			}
		});
    }
}
framedrawable.xml

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/grid_liushui" android:duration="200"/>
    <item android:drawable="@drawable/grid_payout" android:duration="200"/>
    <item android:drawable="@drawable/grid_report" android:duration="200"/>
</animation-list></span>


附上tween动画的源码下载链接

http://download.csdn.net/detail/duanyu218/7449471