基本的動畫構成共有四種:透明動畫/旋轉動畫/移動動畫/縮放動畫。android
配置動畫的方式有兩種,一種是直接使用代碼來配置動畫效果,另外一種是使用xml文檔配置動畫效果app
相比而言,用xml文檔寫出來的動畫效果,寫一次能夠不少次調用,但代碼配置的話則每一次都須要重複配置過程。ide
具體使用代碼:動畫
//這是對一個按鈕設置不一樣的動畫
findViewById(R.id.animation).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用代碼配置透明動畫 AlphaAnimation alphaAnimation = new AlphaAnimation(0,1); //從0到1,表明從徹底透明轉變爲徹底不透明 alphaAnimation.setDuration(1000); //這個變化的時間一共花費1秒 v.startAnimation(alphaAnimation); //啓動此animation // 使用XML文檔配置透明動畫 v.startAnimation(AnimationUtils.loadAnimation(Main2Activity.this,R.anim.alphaanimation)); // 使用代碼配置旋轉動畫
//下面新建的旋轉動畫的意思是從0度旋轉到360度,而旋轉的中心點是相對於自身寬高的一半 RotateAnimation rotateAnimation = new RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); rotateAnimation.setDuration(1000); v.startAnimation(rotateAnimation); // 使用XML文檔配置旋轉動畫 v.startAnimation(AnimationUtils.loadAnimation(Main2Activity.this,R.anim.rotateanimation)); // 使用代碼配置移動動畫 TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,200); //從(0,0)移動到(200,200) translateAnimation.setDuration(1000); v.startAnimation(translateAnimation); // 使用代碼配置移動動畫 v.startAnimation(AnimationUtils.loadAnimation(Main2Activity.this,R.anim.translateanimation)); // 使用代碼配置縮放動畫 ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1,0,0); //按鈕的長和寬的百分比從0縮放到1,縮放的原點在(0,0) scaleAnimation.setDuration(1000); v.startAnimation(scaleAnimation); // 使用XML文檔配置縮放動畫 v.startAnimation(AnimationUtils.loadAnimation(Main2Activity.this,R.anim.scaleanimation)); } });
建立動畫XML文檔的方法:this
1.在res目錄文件下,新建XML文件,選擇類型爲animationspa
2.在該文件夾下新建xml文件,用來配置動畫的相關信息設計
透明動畫的xml配置文件:code
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0" android:toAlpha="1" android:duration="1000"> </alpha>
旋轉動畫的xml配置文件:orm
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:duration="1000" android:pivotX="50%" android:pivotY="50%"> </rotate>
移動動畫的xml配置文件:xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="200" android:fromYDelta="0" android:toYDelta="200" android:duration="1000"> </translate>
縮放動畫的xml配置文件:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale="0" android:toXScale="1" android:fromYScale="0" android:toYScale="1" android:duration="1000"> </scale>
2、混合動畫效果的實現:
1.新建一個animationSet容器,用來儲存各類須要混合的動畫效果數據
2.分別單獨設計混合動畫的各部份內容,而後將每種動畫都添加進animationSet容器
3.經過startAnimation方法啓動混合動畫
實際代碼:
AnimationSet animationSet = new AnimationSet(true); //true容器內的每一個動畫都被使用
//透明動畫
AlphaAnimation alphaAnimation = new AlphaAnimation(0,1); alphaAnimation.setDuration(1000); animationSet.addAnimation(alphaAnimation);
//旋轉動畫 RotateAnimation rotateAnimation = new RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); rotateAnimation.setDuration(1000); animationSet.addAnimation(rotateAnimation);
//縮放動畫 ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1,0,0); scaleAnimation.setDuration(1000); animationSet.addAnimation(scaleAnimation);
//以上的三種動畫就是上面的簡單動畫的複用 v.startAnimation(animationSet);
使用XML文件配置混合動畫的方法:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true" android:duration="1000"> <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="1000"> </alpha> <rotate android:fromDegrees="0" android:toDegrees="360" android:duration="1000" android:pivotX="50%" android:pivotY="50%"> </rotate> <scale android:fromXScale="0" android:toXScale="1" android:fromYScale="0" android:toYScale="1" android:duration="1000"> </scale> </set>
爲動畫設置監聽事件:
動畫的監聽事件包含了三個時間的調用方法:動畫開始,動畫重複,動畫結束。
實際代碼:
Animation a = AnimationUtils.loadAnimation(Main2Activity.this,R.anim.multianimation);
a.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { Toast.makeText(getApplicationContext(),"動畫開始",Toast.LENGTH_SHORT).show(); } @Override public void onAnimationEnd(Animation animation) { Toast.makeText(getApplicationContext(),"動畫結束",Toast.LENGTH_SHORT).show(); } @Override public void onAnimationRepeat(Animation animation) { Toast.makeText(getApplicationContext(),"動畫重複調用",Toast.LENGTH_SHORT).show(); } }); v.startAnimation(a);
自定義動畫的實現方法步驟:
1.自定義class,繼承Animation
2.根據實際須要重寫父方法,設計代碼實現實際需求
3.經過類名調用(使用方法與系統動畫一致)
實際代碼:
import android.view.animation.Animation; import android.view.animation.Transformation; /** * Created by Andrew on 2016/7/27. */ public class CustomAnimation extends Animation { @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { //這是一個能夠獲取動畫控件的寬高和父容器的寬高的方法 super.initialize(width, height, parentWidth, parentHeight); } //須要特別注意的是,此方法是會執行無數次,期間interpolatedTime會從0到1變化無數次,全部動畫的實現基本都與這個數值的變化有關 @Override protected void applyTransformation(float interpolatedTime, Transformation t) { // interpolatedTime 這是一個與動畫運行週期相關的數值,在動畫運行過程當中,它會從0變成1 // t參數是接受變化的控件對象 //自定義動畫效果:透明漸變 t.setAlpha(interpolatedTime); //因爲interpolatedTime是從0變化到1的,將他的值設置進去技能實現透明度漸變 //自定義動畫效果:X軸的晃動效果 t.getMatrix().setTranslate((float) (Math.sin(interpolatedTime)*50),0); super.applyTransformation(interpolatedTime, t); } }