1. 程式人生 > 實用技巧 >【轉載】Android屬性動畫和檢視動畫的區別

【轉載】Android屬性動畫和檢視動畫的區別

提起動畫首先想到的是動畫片,童年最愛的黑貓警長,葫蘆娃,邋遢大王,大臉貓和藍皮鼠,四驅兄弟,七龍珠等等,當時覺著好神奇,他們是怎麼動的呢。動畫其實就是一幀幀的畫面順序播放,只要畫面切換的夠快,會我們眼中形成視覺殘留的效果,人眼不會感覺到突兀也就會認為畫面是連續運動的,至於24幀什麼的這裡就不說了,現在的手機普遍支援60幀每秒,微鯨的vr裝置好像87幀每秒,只要遊戲本身不卡頓,玩起來還是挺流暢的。動畫可以實現各種各樣的特效,android平臺開發過程中動畫也相當重要。
Android平臺提供了強大的動畫框架,使我們在完成複雜的特效時不用自己改變空間的位置或者設定屬性通過簡單的動畫程式碼就可以實現,android3.0之前,主要包括兩種動畫方式:補間動畫(Tween Animation)和幀動畫(Frame Animation 或者 Drawable Animation),這兩種動畫統稱為view 動畫,針對檢視動畫存在的不足,3.0之後google增加了屬性動畫(Property Animation)。之後動畫就被分成了View Animation 和Property Animation。

關於動畫的一道面試題:
在應用中常看到不斷變化的數字怎麼實現?

檢視動畫:

1 補間動畫(Tween Animation):

  補間動畫是檢視動畫的一種,Tween中文意思是在兩者之間,中文翻譯成補間還是挺貼合意思的,view從一個位置的特定狀態變化到另外一個位置,中間過程我們開發者不需要自己完成,補間動畫會根據我們屬性的設定自己進行每一幀的補充,最後展現一個變化的過程,就叫做補間動畫(自己理解)。

補間動畫可以(僅可以)完成view的位置、大小、旋轉、透明度等一系列簡單的變換,可通過xml檔案或者程式碼實現,通常補件動畫都是利用xml檔案實現,屬性設定簡單明瞭,又可以重複使用。

 基於View的漸變動畫,她只改變了View的繪製效果,而實際屬性值未變。比如動畫移動一個控制元件的位置,但控制元件實際位置仍未改變,如果我們此時想選中控制元件,它的位置仍在動畫之前的位置。可以在res/anim/資料夾中定義XML檔案實現動畫,也可以利用AnimationSet類和Animation的子類完成動畫。
  • alpha 漸變透明度動畫效果
  • scale 漸變尺寸伸縮動畫效果
  • translate 畫面轉換位置移動動畫效果
  • rotate 畫面轉移旋轉動畫效果
    舉例:放在res/anim/資料夾下:
  <?xml version="1.0" encoding="utf-8"?>  
    <scale xmlns:android="http://schemas.android.com/apk/res/android"  
        android:fromXScale="0.0"  
        android:toXScale="1.1"  
        android:fromYScale="0.0"  
        android:toYScale="1.1"  
        android:pivotX=30"  
        android:pivotY="20"  
        android:duration="500" />  

補間動畫使用很方便,但也有很大的侷限性,首先動畫雖然執行了但是隻是我們看到的,控制元件真實的位置透明度等都沒有變化,如果我們想對一個已經移動的控制元件執行點選事件,如果控制元件移動的位置比較大點選介面上看到的控制元件是無法觸發事件的。

補間動畫只能針對設計好的特定的幾種屬性執行動畫,對於自定義的屬性則不太好完成(或者說根本不支援)。

2 幀動畫(Frame Animation 或者 Drawable Animation):

幀動畫也是view動畫的一種,幀動畫是通過讀取xml檔案中設定的一系列Drawable,以類似幻聽片的方式展示這些drawable,就形成了動畫效果,當然也可以利用程式碼實現幀動畫。可能大家覺著幀動畫不太常用,其實類似的原理可以借鑑,類似android手機開機的很多動畫效果就是類似幀動畫,載入一系列圖片,實現開機的動畫效果。

 在程式碼中定義動畫幀,使用AnimationDrawable類;XML檔案能更簡單的組成動畫幀,在res/drawable資料夾,使用<animation-list>採用<item>來定義不同的幀。

但是依舊推薦使用xml,具體如下:
<animation-list> 必須是根節點,包含一個或者多個<item>元素,屬性有:

· android:oneshot true代表只執行一次,false迴圈執行。
· <item> 類似一幀的動畫資源。
<item> animation-list的子項,包含屬性如下:
· android:drawable 一個frame的Drawable資源。
· android:duration 一個frame顯示多長時間。
檔案放在res/drawable/目錄下

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="drawable_resource"
        android:duration="integer" /></animation-list>

幀動畫是最簡單的動畫,用的比較少。

3 屬性動畫(Property Animation):

 屬性動畫在檢視動畫之後推出,API 11 以上才能夠使用,是為了彌補檢視動畫存在的問題,從名字可以看出屬性動畫和檢視動畫的不同,檢視動畫主要針對檢視起作用,屬性動畫則是通過改變Object的屬性進行動畫實現。通過改變view或者object的屬性實現動畫是屬性動畫的最根本的特點。

對數值的操作:

ValueAnimator animator = ValueAnimator.ofInt(0,700);  

 animator.setDuration(1000);  

 animator.start(); 

對view的操作:

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);  

animator.setDuration(1000);  

animator.start();  
  • 第一個引數用於指定這個動畫要操作的是哪個控制元件
  • 第二個引數用於指定這個動畫要操作這個控制元件的哪個屬性
  • 第三個引數是可變長引數,這個就跟ValueAnimator中的可變長引數的意義一樣了,就是指這個屬性值是從哪變到哪

新增監聽:

ValueAnimator animator = ValueAnimator.ofInt(0,400);  

animator.setDuration(1000);  

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  

    @Override  

   public void onAnimationUpdate(ValueAnimator animation) {  

       int valcur = (int)animation.getAnimatedValue();  

    }  

});  

animator.start();  

4 檢視動畫和屬性動畫的區別:

由於出現的時間不同,檢視動畫和屬性動畫有幾個顯而易見的不同:

檢視動畫早於屬性動畫,檢視動畫在API 1裡面就已經存在,屬性動畫直到API3.0才出現,檢視動畫所在的包名為android.view.animation,屬性動畫為android.animation,可見檢視動畫只針對view起作用;試圖動畫中用到的類一般以Animation結尾,而屬性動畫則以Animator結尾。

為什麼引入檢視動畫:

幀動畫可以通過順序播放資源來實現動畫的,補間動畫可以實現控制元件的漸入漸出、移動、旋轉和縮放效果。但類似利用動畫改變View的背景或者改變一個數值或者改變一個物件的屬性檢視動畫就無法完成此類工作了,所以檢視動畫存在侷限性。屬性動畫還支援監聽動畫過程,在動畫過程中自己操作控制元件進行改變。

檢視動畫的檔案在android.view.animation下,通過學習也可以知道,檢視動畫只能作用於檢視,實現類似縮放、旋轉功能,動畫效果比較固定;而屬性動畫可以通過改變View的屬性完成動畫,利用setxxx()和getxxx()函式可以對Object的任意屬性改變,從而可以實現檢視動畫實現不了的功能。可以通過在object中新增屬性的set函式,在ondraw方法中操作屬性就可以完成動畫

屬性動畫通過改變view屬性實現動畫,而檢視動畫雖然利用動畫改變了view的位置和大小,但view真正的屬性沒有改變,這就會導致許多問題,檢視動畫過後我們再去操作view則得不到響應,這就是為什麼自定義控制元件利用動畫改變控制元件位置後還有呼叫layout()設定view位置的原因,這樣才能真正的改變view的位置,而屬性動畫就可以一步到位的完成。

總結如下:

(1)屬性動畫比檢視動畫更強大,不但可以實現縮放、平移等操作,還可以自己定義動畫效果,監聽動畫的過程,在動畫過程中或完成後做響應的動作。
(2)屬性動畫不但可以作用於View,還能作用於Object。
(3)屬性動畫利用屬性的改變實現動畫,而檢視動畫僅僅改變了view的大小位置,但view真正的屬性沒有改變。

完!後續會對屬性動畫,檢視動畫,插值器,自定義屬性動畫等進行系列介紹。



作者:sliencexiu
連結:https://www.jianshu.com/p/25efc9f3a8f0
來源:簡書