1、Tween動畫 一、特色: 1.只是實現了簡單的漸變,平移,拉伸,縮放; 2.Tween動畫實現完成之後,該動畫會恢復原狀,自身屬性並無發生任何改變,動畫的造成是經過父佈局改變了其位置或漸變度,從而來改變其自己在短期內的屬性 3.此動畫的造成是依賴於其父佈局的,其屬性沒有發生任何改變 二、在Tween動畫中全部動畫的父類是Animation。 三、動畫的漸變 /** * 漸變 / private void alpin(){ /* * 第一個參數:表示開始的透明度 * 第二個參數:表示結束的透明度 * 透明度的範圍是0-1;1表示徹底不透明;0表示徹底透明 / Animation animation=new AlphaAnimation(0,1); animation.setDuration(3000); //設置動畫重複的次數 animation.setRepeatCount(5); /* * Animation.REVERSE:重複的時候進行反轉 * Animation.RESTART:每次執行都從新開始 / animation.setRepeatMode(Animation.RESTART); animation.setAnimationListener(new Animation.AnimationListener() { /* * 動畫開始執行的時候的一個回調 * @param animation / @Override public void onAnimationStart(Animation animation) { } /* * 動畫結束的時候的一個回調 * @param animation / @Override public void onAnimationEnd(Animation animation) { } /* * 動畫重複執行的時候的一個回調 * @param animation / @Override public void onAnimationRepeat(Animation animation) { } }); mImageView.startAnimation(animation); } 四、動畫的縮放 /* * 縮放 / private void scale(){ //按照寬和高的倍數來進行縮放 //默認的縮放點是左上角 // Animation animation=new ScaleAnimation(0.5f,1,0.5f,1); //後面的兩個參數是像素,肯定縮放點的座標 // Animation animation=new ScaleAnimation(0,1,0,1,mImageView.getWidth()/2,mImageView.getHeight()/2); //後面的四個參數是用來肯定縮放點的座標 Animation animation=new ScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animation.setDuration(3000); animation.setRepeatCount(5); animation.setRepeatMode(Animation.REVERSE); mImageView.startAnimation(animation); } 五、動畫的平移 /* 平移 / private void traslate(){ / * 座標0,0是以自身左上角定點的座標爲座標點;移動的單位是像素。 / // Animation animation=new TranslateAnimation(0,100,0,100); /* * 相對點的肯定: * Animation.RELATIVE_TO_SELF:相對於本身 * Animation.ABSOLUTE:相對於絕對點(不多用) * Animation.RELATIVE_TO_PARENT:相對於父容器 * * 值的肯定: * 是以當前寬和該乘以倍數後所肯定的座標 / Animation animation=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,1f); animation.setDuration(2000); animation.setRepeatMode(Animation.REVERSE); animation.setRepeatCount(5); mImageView.startAnimation(animation); } 六、動畫的旋轉 /* * 旋轉 / private void rotation(){ //默認的旋轉點就是以左上角爲旋轉點 // Animation animation=new RotateAnimation(0,180); //後面的兩個參數表示的像素,肯定的是旋轉點的位置 // Animation animation=new RotateAnimation(0,180,mImageView.getWidth()/2,mImageView.getWidth()/2); //後面的四個參數,都是爲了肯定的旋轉點的位置,是按照寬和高的倍數來肯定位置 Animation animation=new RotateAnimation(0,180,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animation.setDuration(3000); animation.setRepeatCount(5); animation.setRepeatMode(Animation.REVERSE); mImageView.startAnimation(animation); } 七、多動畫同時執行 步驟: 1.獲取一個AnimationSet對象; 2.定義一系列動畫(一個或多個); 3.將定義的動畫添加到動畫集中; 4.設置動畫的參數(時間,循環次數,循環方式); 5.使用View對象的startAnimation方法啓動動畫集; /* * 多動畫同時執行 */ private void manyAnima(){ Animation animation=new AlphaAnimation(0,1); Animation animation1=new ScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); Animation animation2=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); AnimationSet animationSet=new AnimationSet(true); animationSet.addAnimation(animation); animationSet.addAnimation(animation1); animationSet.addAnimation(animation2); animationSet.setDuration(5000); mImageView.startAnimation(animationSet); } 八、經過配置文件實現動畫的步驟: 1.在res的目錄下創建一個anim的文件夾; 2.在xml文件中配置相應的動畫屬性; 3.經過AnimationUtils的LoadAnimation()方法加載動畫; 4.設置動畫的相應屬性; 5.運行動畫。android
<?xml version="1.0" encoding="utf-8"?>app
<set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="5000" android:fromAlpha="0" android:toAlpha="1" /> </set> private void alpin1(){ Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.animo_01); mImageView.startAnimation(animation); } 2、Frame動畫 使用的步驟: 1.在res目錄下右鍵-->new --> Android resource file -->填寫名字,選擇Drawable,將根節點給成animation-list -->OK; 2.在建立的xml文件中配置一系列item; <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/girl_1" android:duration="150"/> <item android:drawable="@drawable/girl_2" android:duration="150"/> <item android:drawable="@drawable/girl_3" android:duration="150"/> <item android:drawable="@drawable/girl_4" android:duration="150"/> <item android:drawable="@drawable/girl_5" android:duration="150"/> <item android:drawable="@drawable/girl_6" android:duration="150"/> <item android:drawable="@drawable/girl_7" android:duration="150"/> <item android:drawable="@drawable/girl_8" android:duration="150"/> <item android:drawable="@drawable/girl_9" android:duration="150"/> <item android:drawable="@drawable/girl_10" android:duration="150"/> <item android:drawable="@drawable/girl_11" android:duration="150"/> </animation-list> 3.給須要幀動畫的控件設置setBackgroundResource(R.drawable.frame_01); 4.經過當前對象.getBackground()獲取其背景,強制類型轉換成AnimationDrawable對象; 5.經過animationDrawable.start()直接運行幀動畫; private void frameAnima(){ //設置內容,內容是幀動畫的佈局文件 mImageView1.setBackgroundResource(R.drawable.frame_01); //獲取當前控件的背景 AnimationDrawable animationDrawable = (AnimationDrawable) mImageView1.getBackground(); //打開幀動畫 animationDrawable.start(); } 3、屬性動畫 一、經過給定的時間間隔來完成屬性的動態改變的動畫; 二、屬性動畫改變的是屬性,只不過默認的狀況下是勻速的改變當前對象的屬性; 三、屬性動畫的原理: 每次開始執行的時候都會首先經過調用當前對象的get屬性名的方法獲取當前的值,而後調用set方法來不斷的進行設置對象的值,給定一個時間經過計算出每一個單位時間所移動的距離,而後開始移動。 四、屬性動畫的應用: 1.縮放 /** * 屬性動畫的縮放 */ private void scale(){ ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImageView, "scaleX", 1, 0.5f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(mImageView, "scaleY", 1, 0.5f); scaleX.setDuration(3000); scaleY.setDuration(3000); scaleX.start(); scaleY.start(); } 2.漸變 /** * 屬性動畫的漸變 */ private void alphi(){ ObjectAnimator alpha = ObjectAnimator.ofFloat(mImageView, "alpha", 1, 0.8f, 0.2f); alpha.setDuration(3000); alpha.setRepeatCount(5); alpha.setRepeatMode(Animation.REVERSE); alpha.start(); } 3.旋轉 /** * 屬性動畫的旋轉 */ private void rotation(){ ObjectAnimator rotation = ObjectAnimator.ofFloat(mImageView, "rotation", 0, 360); rotation.setDuration(3000); rotation.setRepeatCount(3); rotation.setRepeatMode(Animation.REVERSE); rotation.start(); } 4.平移 /** * 屬性動畫的平移 */ private void translate(){ ObjectAnimator translationX = ObjectAnimator.ofFloat(mImageView, "translationX", 0, 500); ObjectAnimator translationY = ObjectAnimator.ofFloat(mImageView, "translationY", 0, 500); translationX.setDuration(3000); translationY.setDuration(3000); translationX.setRepeatCount(5); translationY.setRepeatCount(5); translationX.setRepeatMode(Animation.REVERSE); translationY.setRepeatMode(Animation.REVERSE); translationX.start(); translationY.start(); } 5.多個動畫同時執行 /** * 多動畫同時執行 */ private void many(){ AnimatorSet animatorSet=new AnimatorSet(); ObjectAnimator translationX = ObjectAnimator.ofFloat(mImageView, "translationX", 0, 100); translationX.setDuration(3000); ObjectAnimator rotation = ObjectAnimator.ofFloat(mImageView, "rotation", 0, 360); rotation.setDuration(3000); ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImageView, "scaleX", 1, 0.5f); scaleX.setDuration(3000); ObjectAnimator scaleY = ObjectAnimator.ofFloat(mImageView, "scaleY", 1, 0.5f); scaleY.setDuration(3000); //按照順序執行 /* List<Animator> list=new ArrayList<>(); list.add(translationX); list.add(rotation); list.add(scaleX); list.add(scaleY); animatorSet.playSequentially(list);*/ animatorSet.playSequentially(translationX); animatorSet.playSequentially(rotation); animatorSet.playSequentially(scaleX); animatorSet.playSequentially(scaleY); animatorSet.start(); } 6.設置動畫對象的寬度 /** * 由於這個屬性是沒有Set和Get方法的,因此咱們須要經過封裝一個類來提供Set和Get方法 */ private void setWidth(){ Wrapper wrapper=new Wrapper(mImageView); ObjectAnimator.ofInt(wrapper,"width",0,500).setDuration(3000).start(); } class Wrapper{ View target=null; public Wrapper(View target){ this.target=target; } public int getWidth(){ return this.target.getLayoutParams().width; } public void setWidth(int width){ this.target.setLayoutParams(new LinearLayout.LayoutParams(width,target.getLayoutParams().height)); } }ide