Android Transitions Framework

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

scene

scene表示要切換的一個(gè)場(chǎng)景,一般都是在兩個(gè)場(chǎng)景間切換,用一個(gè)布局文件來(lái)替代莫湘。
新建兩個(gè)layout resourse file:

Paste_Image.png

Paste_Image.png

這里表示已經(jīng)創(chuàng)建好了兩個(gè)場(chǎng)景磷斧。接下來(lái)在代碼中通過(guò)scene.getScenforlayout()來(lái)創(chuàng)建scene:

Paste_Image.png

transiton

transition表示切換場(chǎng)景的過(guò)渡假消。上面創(chuàng)建好了兩個(gè)Scene。接下來(lái)創(chuàng)建Transition:

Paste_Image.png

這里加載了一個(gè)Transition資源文件耐床,代表你想要怎么切換這個(gè)這兩個(gè)Scene密幔。資源文件是這樣的:

Paste_Image.png

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

Paste_Image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遏片,一起剝皮案震驚了整個(gè)濱河市嘹害,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吮便,老刑警劉巖笔呀,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異髓需,居然都是意外死亡许师,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門授账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枯跑,“玉大人,你說(shuō)我怎么就攤上這事白热×仓” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵屋确,是天一觀的道長(zhǎng)纳击。 經(jīng)常有香客問(wèn)我,道長(zhǎng)攻臀,這世上最難降的妖魔是什么焕数? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮刨啸,結(jié)果婚禮上堡赔,老公的妹妹穿的比我還像新娘。我一直安慰自己设联,他們只是感情好善已,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布灼捂。 她就那樣靜靜地躺著,像睡著了一般换团。 火紅的嫁衣襯著肌膚如雪悉稠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天艘包,我揣著相機(jī)與錄音的猛,去河邊找鬼。 笑死想虎,一個(gè)胖子當(dāng)著我的面吹牛卦尊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磷醋,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猫牡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胡诗!你這毒婦竟也來(lái)了邓线?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煌恢,失蹤者是張志新(化名)和其女友劉穎骇陈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑰抵,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡你雌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了二汛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿崭。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肴颊,靈堂內(nèi)的尸體忽然破棺而出氓栈,到底是詐尸還是另有隱情,我是刑警寧澤婿着,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布授瘦,位于F島的核電站,受9級(jí)特大地震影響竟宋,放射性物質(zhì)發(fā)生泄漏提完。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一丘侠、第九天 我趴在偏房一處隱蔽的房頂上張望徒欣。 院中可真熱鬧,春花似錦蜗字、人聲如沸打肝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闯睹。三九已至戏羽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楼吃,已是汗流浹背始花。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孩锡,地道東北人酷宵。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躬窜,于是被迫代替她去往敵國(guó)和親浇垦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容