這個(gè)framework級(jí)別的動(dòng)畫效果有以下特點(diǎn):
-
Group-level animations
在一個(gè)View Hierarchy中的所有View施加動(dòng)畫刺下。 -
Transition-based animation
基于開始和結(jié)束View的屬性改變進(jìn)行動(dòng)畫 -
Built-in animations
包含了事先定義好的動(dòng)畫比如淡出和移除 -
Resource file support
從layout資源文件夾來(lái)加載視圖層次結(jié)構(gòu)(hierarchy )和內(nèi)建的動(dòng)畫 -
Lifecycle callbacks
可以定義一些生命周期恤筛,讓你能更好地控制動(dòng)畫和層次結(jié)構(gòu)(hierarchy )的改變過(guò)程扁眯。
這是達(dá)到的切換效果:
scene
scene表示要切換的一個(gè)場(chǎng)景,一般都是在兩個(gè)場(chǎng)景間切換,用一個(gè)布局文件來(lái)替代莫湘。
新建兩個(gè)layout resourse file:
這里表示已經(jīng)創(chuàng)建好了兩個(gè)場(chǎng)景磷斧。接下來(lái)在代碼中通過(guò)
scene.getScenforlayout()
來(lái)創(chuàng)建scene:
transiton
transition表示切換場(chǎng)景的過(guò)渡假消。上面創(chuàng)建好了兩個(gè)Scene。接下來(lái)創(chuàng)建Transition:
這里加載了一個(gè)Transition資源文件耐床,代表你想要怎么切換這個(gè)這兩個(gè)Scene密幔。資源文件是這樣的:
有了Scene,有了Transition,就可以進(jìn)行切換了撩轰。調(diào)用TransitionManager.go()
就可以了胯甩;
這就實(shí)現(xiàn)了一開始的那種切換效果。
不使用Scene來(lái)實(shí)現(xiàn)Transition
可以使用TransitionManager.beginDelayedTransition()來(lái)實(shí)現(xiàn)不適用Scene實(shí)現(xiàn)變換堪嫂,想象一個(gè)場(chǎng)景偎箫,一個(gè)Activity中有個(gè)搜索框,當(dāng)你點(diǎn)擊搜索按鈕的時(shí)候皆串,下面彈出來(lái)搜索結(jié)果淹办,這時(shí)候可以加一個(gè)Transition淡入,就可以在Button上綁定監(jiān)聽事件恶复,當(dāng)點(diǎn)擊時(shí)調(diào)用上述方法,然后使用ViewGroup.add()ViewGrou.remove()
等方法系統(tǒng)會(huì)自動(dòng)幫我們實(shí)現(xiàn)效果怜森。也可以自己添加效果。
為動(dòng)畫過(guò)程添加回調(diào)
當(dāng)你調(diào)用TransitionManager.go()的時(shí)候谤牡,Transition的生命周期就開始了副硅,一直到動(dòng)畫完成。在一些重要的環(huán)節(jié)翅萤,可以調(diào)用定義在 TransitionListener中的回調(diào)方法恐疲。這里為了拷貝一個(gè)View的屬性回到下一個(gè)場(chǎng)景的屬性,可以調(diào)用TransitionListener.onTransitionEnd()套么。
自定義變換動(dòng)畫
自定義動(dòng)畫可以讓你不拘泥與系統(tǒng)那幾種內(nèi)建的動(dòng)畫流纹,但是這也就意味著必須自己捕獲View的屬性和產(chǎn)生動(dòng)畫。
繼承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用的是屬性動(dòng)畫违诗,所以必須捕獲開始和結(jié)束的屬性漱凝,但是經(jīng)常動(dòng)畫變幻時(shí)只需要一部分屬性,比如改變顏色是你只需View的顏色屬性诸迟,改變位置時(shí)茸炒,只需要View的位置屬性愕乎,所以TransitionFrameWork提供了一系列回調(diào)方法來(lái)來(lái)獲取它需要的屬性并且存儲(chǔ)他們。
-
captureStartValues(transitionValues)
這個(gè)方法用于捕獲開始的屬性壁公,參數(shù)是一個(gè) TransitionValues它保存了一個(gè)View的引用感论,并且內(nèi)部使用Map來(lái)保存屬性,框架會(huì)為了Scene中的每個(gè)View調(diào)用這個(gè)方法紊册。為了屬性不和其他TransitionValues沖突比肄,屬性值一般都是采用下面這個(gè)模式:
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)會(huì)為每一個(gè)在結(jié)束場(chǎng)景中的TargetView調(diào)用這個(gè)方法,其他都和captureStartValues(transitionValues)方法是一樣的,并且參數(shù)是同一個(gè)TransitionValues囊陡,但是在開始和結(jié)束場(chǎng)景中的值確實(shí)不一樣的芳绩,因?yàn)檫@個(gè)系統(tǒng)使用了兩個(gè)獨(dú)立的Map來(lái)保存View的狀態(tài)
有了狀態(tài)數(shù)據(jù)就可以創(chuàng)建動(dòng)畫了
這里要覆蓋 [createAnimator()](https://developer.android.com/reference/android/transition/Transition.html#createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues))
這個(gè)方法,系統(tǒng)調(diào)用這個(gè)方法是會(huì)把scene的根View和TransitionValues傳遞個(gè)它撞反,這個(gè)TransitionValues在上面就說(shuō)了保存了開始場(chǎng)景和結(jié)束場(chǎng)景View的屬性值妥色。創(chuàng)建動(dòng)畫的方式和一般創(chuàng)建動(dòng)畫的方式都是一樣的。