1. 程式人生 > >android 動畫詳解

android 動畫詳解

 我們在開發時,很多地方會應用到動畫,安卓為我們提供很多種動畫方式,下面介紹android為我們提供的動畫。害羞

1.android 動畫分為三種:補間動畫,幀動畫,屬性動畫(屬性動畫為API 11 新特性)
2.1補間動畫的種類
1)TranslateAnimation(平移動畫):2)ScaleAnimation (縮放動畫)3) RoateAnimation (旋轉動畫)4)AlphaAnimation(透明動畫)、它們都是Animation的子類;2.2 固定語法:

2.3 標籤的介紹:

<set> : 動畫的集合,對應animationSet類,可以包含若干個動畫;android:shareInterpolator: 表示動畫是否和集合共享一個差值器,如果集合不指定差值器,子動畫就需要單獨制定所需要的差值器或者預設值<translate>: 表示平移動畫,對應TransAnimation類,屬性含義: fromXDelta ------ 表示X的起始值,比如0toXDelta -------- 表示X的結束值,比如100fromYDelta ------ 表示Y的起始值;toYDelta -------- 表示Y的結束值<scale> : 表示縮放動畫, 對應ScaleAnimation,放大和縮小的效果;屬性含義:fromXScale ----- 表示水平縮放的起始值 例如0.5;toXScale -------- 表示水平縮放的結束值, 比如1.2;fromYScale ------ 豎直方向縮放的起始值toYScale ------- 豎直方向的結束值pivotX --------- 縮放的軸點x座標,他會影響縮放效果pivotY --------- 縮放的軸點y座標,他會影響縮放效果<rotate> 表示旋轉動畫 對應於RotateAnimation, 使view具有旋轉效果fromDegrees ---- 旋轉的開始角度toDegrees ----- 旋轉的結束角度pivotX --------- 旋轉的軸點x座標pivotY ------- 旋轉軸點的Y軸座標<alpha> 表示透明度動畫 對應AlphaAnimation, 改變view的透明度fromAlpha --- 表示透明度的起始值 比如0.1 toAlpha ---- 表示透明度的結束值 比如1duration ----- 動畫的持續時間fillAfter ------ 動畫結束後是否停留結束位置,true表示停留在結束位置,false則不停留
2.4 如何應用上面的動畫:
方式一: 在xml佈局中定義動畫效果方式二: 在程式碼中應用動畫效果,
3.1 自定義view的動畫;
派生一種新動畫只需要繼承Animation這個抽象類,然後重寫initialize和applyTransformation方法,在initialize方法中做一些初始化的工作,在applyTransformation中進行相應矩陣變化。很多時候需要採用Camera來簡化矩陣變化過程,自定義view複雜的地方在於,自定義view動畫的過程主要是矩陣變化的過程,而矩陣變化是數學上的概念,實現過程比較複雜。4.1幀動畫幀動畫是順序播放一組事先定義好的圖片,類似於電影播放,系統提供另外一個類AnimationDrawable來使用幀動畫,使用舉例:在程式碼中使用:
view是你的元件(button。。。)5.1 view動畫的特殊性:1.LayoutAnimation 作用於ViewGroup,為ViewGroup指定一個動畫,這樣當他的子元素出場時會有動畫效果。(listView)為viewGroup添加出場效果:1)定義LayoutAnimation屬性的含義:delay:表示子元素開始動畫的時間延遲,(例如子元素入場動畫週期300ms 0.5就表示子元素需要延時150ms)animationOrder: 表示子元素動畫順序,有三種1)mormal :表示順序顯示2)reverse: 表示逆向顯示3)random: 表示隨機播放入場動畫animation : 表示要載入哪個動畫2.為子元素指定入場動畫

3.為viewGroup指定layoutAnimation屬性,除了在xml中指定LayoutAnimation外,還可以在LayoutAnimationController來實現
5.2 activity的切換效果
Activity有預設的切換效果,但是這個效果我們可以自定義,overridePendingTransition(int enterAnim,int exitAnim);這個方法,這個方法必須在startActivity()或者finish()之後呼叫才能生效。屬性含義:enterAnim: Activity被開啟時(相當於進入的activity),exitAnim : activity被暫停時(被移除的Activity);當啟動一個Activity時,當activity退出時,
Fragment也可以新增切換動畫,由於Fragment是在API 11中新引入的類,因此需要使用v4包。這種情況我們可以通過FragmentTransction中setCustomAnimations()來切換動畫;在低版本中無法使用,不具有很高的使用價值;
6.1 屬性動畫:
補間動畫和幀動畫的缺陷:1)他們只能作用在View的檢視上,無法在非View的物件進行操作。2)沒有改變view的屬性,只改變view物件的效果;3)動畫效果單一,只有平移,旋轉等效果。6.2 屬性動畫 屬性動畫彌補了這些不足,效果上不單單就那四種,作用物件也進行了擴充套件。不只是view物件,甚至沒有物件也可以。6.3 屬性動畫的工作原理在一定時間間隔內,通過改變值,並將值賦值到屬性或者物件上來改變動畫效果具體的工作原理:先設定動畫執行時間,動畫對應的屬性初始值和結束值。通過差值器和估值器來設定屬性值從初始值到結束值的變化邏輯根據上述的邏輯不斷的改變值,每改動一次,就賦值給物件屬性值一次,(通過手動和自動的兩種方式:)每次賦值呼叫invalidate()不斷重新整理檢視,不斷的重複直到初始值等於結束值,動畫結束。6.4 ValueAnimator類控制值的變化,不斷的手動賦值給物件屬性,從而實現動畫效果。ValueAnimator類中有三個重要方法1)ValueAnimator.ofInt(int values);作用:將初始值以int整數值的形式過渡到結束值使用:可以分為XML java程式碼兩種方式;在實際開發中建議使用java程式碼實現屬性動畫,因為起始值我們是無法提前確定的。案例:將button 寬度從150-800動畫效果的展示1.1 java程式碼的實現//屬性動畫實現的功能private void PropertyAnimation() { //步驟一 //設定動畫屬性的初始值和結束值 ValueAnimator anim = ValueAnimator.ofInt(btn.getLayoutParams().width,800); //步驟二 //設定動畫播放的各種屬性 //設定動畫的播放時間長度 anim.setDuration(5000); //設定動畫的延時時間長度、 anim.setStartDelay(500); //設定動畫的播放次數 //動畫播放次數=infinlte時,重複無限播放 anim.setRepeatCount(0); //設定重複播放動畫模式 //REVERSE(倒敘播放) //RESTART(預設 正序重複) anim.setRepeatMode(ValueAnimator.RESTART); //步驟三 //將改變的值手動賦值給物件和屬性 //設定動畫的更新監聽,值每改變一次,就呼叫一次監聽 anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //獲得改變後的值 int curr =(Integer) animation.getAnimatedValue(); //步驟四 將改變的值賦值給物件和屬性 btn.getLayoutParams().width=curr; //步驟五 重新整理檢視 重新繪製 完成動畫 btn.requestLayout(); } }); anim.start();}1.2 xml佈局的實現在java程式碼中啟動動畫Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation); // 載入XML動畫animator.setTarget(view); // 設定動畫物件animator.start(); // 啟動動畫2) ValueAnimator。oFloat(float value);將初始值以浮點型的形式過渡到結束值使用方法同上,只是在差值器上過渡的型別不同3)估值器(TypeEvaluator)設定動畫如何從初始值過渡到結束值的邏輯差值器(Interpollator) 決定值的變化模式(勻速 加速blabla)估值器決定值的具體變化數值valueAnimator.ofInt(),Value.oFloat()都有預設值,都具備系統內建的估值器但是ValueAnimator.ofObject(),由於物件動畫複雜多樣化,系統無法知道如何從初始物件過渡到結束物件,所以沒有預設估值器,所以我們需要自定義估值器。4)valueAnimator.ofObject();將初始值以物件的形式過渡到結束值如何自定義?我們實現TypeEvaluator介面,重寫evaluate()方法,evaluate()方法引數說明;1)fration: 動畫的完成度(根據計算當前動畫值)2)startValue endValue: 動畫的初始值和結束值實現物件動畫過渡邏輯將物件動畫過渡的邏輯計算後的值返回。案例:實現動畫效果:一個圓從一個點移動到另一個點實現步驟;步驟一:定義物件類ValueAnimator.ofObject() 需要自定義物件類該物件操作圓的點的座標步驟二:自定義估值器 實現TypeEvaluator介面實現如何從初始點座標過渡到結束點座標步驟三:將屬性動畫作用到自定義view上步驟四:在佈局檔案中加入自定義view控制元件7.1 ObjectAnimator類可以直接對物件屬性進行改變操作完成動畫效果;1)直接改變view的alpha屬性實現透明度效果2)繼承自ValueAnimator類,實現基於ValueAnimator類的動畫效果ObjectAnimator與ValueAnimator類的區別:ValueAnimator類,先改變值,手動的賦值給物件的屬性實現動畫,間接對物件屬性進行操作。ObjectAnimator類先改變值,自動的賦值給物件的屬性實現動畫,直接對物件進行操作;、7.2 使用:由於繼承ValueAnimator類,實現方法十分類似1.建立物件例項ObjectAnimator animator = ObjectAnimator.ofFloat(Objectobject, Stringproperty, float ....values); 引數說明:Object: 需要操作的物件property: 需要操作物件的屬性vlaues:設定初始值和結束值7.3 實現案例1)透明度: ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f); // 表示的是: // 動畫作用物件是mButton // 動畫作用的物件的屬性是透明度alpha // 動畫效果是:常規 - 全透明 - 常規 animator.setDuration(5000); animator.start();2)旋轉 ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f); // 表示的是: // 動畫作用物件是mButton // 動畫作用的物件的屬性是旋轉alpha // 動畫效果是:0 - 360 animator.setDuration(5000); animator.start();3)平移float curTranslationX = mButton.getTranslationX(); // 獲得當前按鈕的位置 ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX); // 表示的是: // 動畫作用物件是mButton // 動畫作用的物件的屬性是X軸平移(在Y軸上平移同理,採用屬性"translationY" // 動畫效果是:從當前位置平移到 x=1500 再平移到初始位置 animator.setDuration(5000); animator.start();4)縮放 ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "scaleX", 1f, 3f, 1f); // 表示的是: // 動畫作用物件是mButton // 動畫作用的物件的屬性是X軸縮放 // 動畫效果是:放大到3倍,再縮小到初始大小 animator.setDuration(5000); animator.start();5)自定義屬性動畫效果實現的效果:一個圓的顏色漸變實現步驟:1)設定物件屬性的get()set()方法通過1.整合原始類,直接給類加上該屬性的get(),set(),從而實現給物件加上該屬性的get,set2.通過包裝原始動畫,間接給物件加上該屬性的get,set(用一個類來包裝原始物件)2)在佈局檔案中加入自定義控制元件3)根據需要實現TypeEvaluator介面(估值器)4)呼叫ObjectAnimator。ofObject();通過包裝類,間接給物件加上該屬性的get,setpublic class MainActivity extends AppCompatActivity { Button mButton; ViewWrapper wrapper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.Button); // 建立動畫作用物件:此處以Button為例 wrapper = new ViewWrapper(mButton); // 建立包裝類,並傳入動畫作用的物件 mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(3000).start(); // 設定動畫的物件是包裝類的物件 } }); } // 提供ViewWrapper類,用於包裝View物件 // 本例:包裝Button物件 private static class ViewWrapper { private View mTarget; // 構造方法:傳入需要包裝的物件 public ViewWrapper(View target) { mTarget = target; } // 為寬度設定get() & set() public int getWidth() { return mTarget.getLayoutParams().width; } public void setWidth(int width) { mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } }}8.1 屬性動畫的監聽事件 Animation.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animation animation) { //動畫開始時執行 } @Override public void onAnimationRepeat(Animation animation) { //動畫重複時執行 } @Override public void onAnimationCancel()(Animation animation) { //動畫取消時執行 } @Override public void onAnimationEnd(Animation animation) { //動畫結束時執行 } });//需要注意的是每一次監聽,四個方法必須都得重寫9.1 組合動畫當我們需要同時使用多種動畫效果時,我們使用組合動畫AnimationSet類paly : 播放當前動畫alter(Long delay) 延遲執行動畫with : 當前動畫和傳入的動畫同時執行after: 將現有的動畫插入到傳入動畫的後邊執行before : 將現有的動畫插入到傳入動畫之前執行java程式碼的實現// 步驟1:設定需要組合的動畫效果ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX); // 平移動畫ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f); // 旋轉動畫ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f); // 透明度動畫// 步驟2:建立組合動畫的物件AnimatorSet animSet = new AnimatorSet(); // 步驟3:根據需求組合動畫animSet.play(translation).with(rotate).before(alpha); animSet.setDuration(5000); // 步驟4:啟動動畫animSet.start(); android的動畫講解就這麼多了,希望對大家有所幫助,吐舌頭