爲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的實現如下:
此時的動畫效果如下:
- 設置Activity透明背景
上面的動畫還有一個問題:第二個Activity展開的時候,它的背景不是第一個Activity,而是白色背景,這是因爲默認的主題爲每個Activity設置了白色作爲窗口的背景,因此需要在style中創建一個背景爲透明的主題,並在AndroidManifest.xml中設置SecondActivty的主題爲透明背景主題。
透明背景主題代碼如下:
最後的效果如下:
3. 小結
至此實現了一個簡單的基於addOnPreDrawListener的轉換動畫,這種轉換動畫相對於overridePendingTransitions更爲靈活,提供了更多想象空間,同時相比於TransitionManager有更好的兼容性。
這種方式目前存在的問題是需要爲頂級view以及各層子view分別設置動畫,使得頂級view和子view同時展開,或子view延後展開(否則會出現子view已經繪製到目標位置,頂級view仍然在執行動畫的情況),對於複雜的佈局而言實現有些繁瑣。