這個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á)到的切換效果:

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


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

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

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

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

這就實(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)建動畫的方式都是一樣的。