Android Transitions Framework

這個framework級別的動畫效果有以下特點(diǎn):

  • Group-level animations
    在一個View Hierarchy中的所有View施加動畫。
  • Transition-based animation
    基于開始和結(jié)束View的屬性改變進(jìn)行動畫
  • Built-in animations
    包含了事先定義好的動畫比如淡出和移除
  • Resource file support
    從layout資源文件夾來加載視圖層次結(jié)構(gòu)(hierarchy )和內(nèi)建的動畫
  • Lifecycle callbacks
    可以定義一些生命周期,讓你能更好地控制動畫和層次結(jié)構(gòu)(hierarchy )的改變過程。
    這是達(dá)到的切換效果:
GIF.gif

scene

scene表示要切換的一個場景,一般都是在兩個場景間切換,用一個布局文件來替代。
新建兩個layout resourse file:

Paste_Image.png

Paste_Image.png

這里表示已經(jīng)創(chuàng)建好了兩個場景。接下來在代碼中通過scene.getScenforlayout()來創(chuàng)建scene:

Paste_Image.png

transiton

transition表示切換場景的過渡。上面創(chuàng)建好了兩個Scene。接下來創(chuàng)建Transition:

Paste_Image.png

這里加載了一個Transition資源文件,代表你想要怎么切換這個這兩個Scene。資源文件是這樣的:

Paste_Image.png

有了Scene,有了Transition,就可以進(jìn)行切換了。調(diào)用TransitionManager.go()就可以了;

Paste_Image.png

這就實(shí)現(xiàn)了一開始的那種切換效果。

不使用Scene來實(shí)現(xiàn)Transition

可以使用TransitionManager.beginDelayedTransition()來實(shí)現(xiàn)不適用Scene實(shí)現(xiàn)變換,想象一個場景,一個Activity中有個搜索框,當(dāng)你點(diǎn)擊搜索按鈕的時候,下面彈出來搜索結(jié)果,這時候可以加一個Transition淡入,就可以在Button上綁定監(jiān)聽事件,當(dāng)點(diǎn)擊時調(diào)用上述方法,然后使用ViewGroup.add()ViewGrou.remove()等方法系統(tǒng)會自動幫我們實(shí)現(xiàn)效果。也可以自己添加效果。

為動畫過程添加回調(diào)

當(dāng)你調(diào)用TransitionManager.go()的時候,Transition的生命周期就開始了,一直到動畫完成。在一些重要的環(huán)節(jié),可以調(diào)用定義在 TransitionListener中的回調(diào)方法。這里為了拷貝一個View的屬性回到下一個場景的屬性,可以調(diào)用TransitionListener.onTransitionEnd()。

自定義變換動畫

自定義動畫可以讓你不拘泥與系統(tǒng)那幾種內(nèi)建的動畫,但是這也就意味著必須自己捕獲View的屬性和產(chǎn)生動畫。

繼承Transition Class

要實(shí)現(xiàn)這些方法

public class CustomTransition extends Transition {   
 @Override 
   public void captureStartValues(TransitionValues values) {}  
  @Override    
public void captureEndValues(TransitionValues values) {}   
 @Override 
   public Animator createAnimator(ViewGroup sceneRoot,    TransitionValues startValues,          TransitionValues endValues) {}}

Transition Animation用的是屬性動畫,所以必須捕獲開始和結(jié)束的屬性,但是經(jīng)常動畫變幻時只需要一部分屬性,比如改變顏色是你只需View的顏色屬性,改變位置時,只需要View的位置屬性,所以TransitionFrameWork提供了一系列回調(diào)方法來來獲取它需要的屬性并且存儲他們。

  • captureStartValues(transitionValues)
    這個方法用于捕獲開始的屬性,參數(shù)是一個 TransitionValues它保存了一個View的引用,并且內(nèi)部使用Map來保存屬性,框架會為了Scene中的每個View調(diào)用這個方法。為了屬性不和其他TransitionValues沖突,屬性值一般都是采用下面這個模式:
package_name:transition_name:property_name
public class CustomTransition extends Transition {   
 // Define a key for storing a property value in    
// TransitionValues.values with the syntax 
   // package_name:transition_class:property_name to avoid collisions   
 private static final String PROPNAME_BACKGROUND ="com.example.android.customtransition:CustomTransition:background";   
 @Override    
public void captureStartValues(TransitionValues transitionValues) {  
      // Call the convenience method captureValues       
 captureValues(transitionValues);    
}    
// For the view in transitionValues.view, get the values you   
 // want and put them in transitionValues.values 
   private void captureValues(TransitionValues transitionValues) {    
    // Get a reference to the view       
 View view = transitionValues.view;     
   // Store its background property in the values map        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());  
  }   
 ...}
  • captureEndValues(TransitionValues)
    系統(tǒng)會為每一個在結(jié)束場景中的TargetView調(diào)用這個方法,其他都和captureStartValues(transitionValues)方法是一樣的,并且參數(shù)是同一個TransitionValues,但是在開始和結(jié)束場景中的值確實(shí)不一樣的,因?yàn)檫@個系統(tǒng)使用了兩個獨(dú)立的Map來保存View的狀態(tài)

有了狀態(tài)數(shù)據(jù)就可以創(chuàng)建動畫了

這里要覆蓋 [createAnimator()](https://developer.android.com/reference/android/transition/Transition.html#createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues))
這個方法,系統(tǒng)調(diào)用這個方法是會把scene的根View和TransitionValues傳遞個它,這個TransitionValues在上面就說了保存了開始場景和結(jié)束場景View的屬性值。創(chuàng)建動畫的方式和一般創(chuàng)建動畫的方式都是一樣的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容