一種新的Activity轉換動畫實現方式

爲Android中基本的View組建Activity設置轉換動畫的方式一般有兩種:通過overridePendingTransitions設置,以及使用TransitionManager實現。overridePendingTransitions只能使用XML來設置Activity的進入和退出動畫,侷限性很大。而使用TransitionManager只兼容API level 19及以上的設備。最近在InstaMaterial concept中發現其利用addOnPreDrawListener方法,提供了一種新的Activity轉換動畫實現方式,這裏詳細記錄下這種基於addOnPreDrawListener()的實現方式。

1. 實現展開動畫

首先創建一個基本的Activity轉換場景,去掉默認的轉換動畫,沒有任何動畫的Activity轉換效果如下。

修改第二個Activity的佈局activty_second,設置最頂層的佈局id爲root。之後,在SecondAcivity的onCreate中,爲root設置動畫,核心部分代碼如下:

這裏需要注意的是: 1)只需要在首次創建時執行動畫,因此需要滿足條件savedInstanceState == null;2)在onPreDraw中要首先移除OnPreDrawListener,否則在動畫過程中會多次調用,導致死循環。
最後,startRootAnimation的實現如下:

此時的動畫效果如下:

  1. 設置Activity透明背景

上面的動畫還有一個問題:第二個Activity展開的時候,它的背景不是第一個Activity,而是白色背景,這是因爲默認的主題爲每個Activity設置了白色作爲窗口的背景,因此需要在style中創建一個背景爲透明的主題,並在AndroidManifest.xml中設置SecondActivty的主題爲透明背景主題。
透明背景主題代碼如下:

最後的效果如下:

3. 小結

至此實現了一個簡單的基於addOnPreDrawListener的轉換動畫,這種轉換動畫相對於overridePendingTransitions更爲靈活,提供了更多想象空間,同時相比於TransitionManager有更好的兼容性。

這種方式目前存在的問題是需要爲頂級view以及各層子view分別設置動畫,使得頂級view和子view同時展開,或子view延後展開(否則會出現子view已經繪製到目標位置,頂級view仍然在執行動畫的情況),對於複雜的佈局而言實現有些繁瑣。

原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章