Android Activity 轉場動畫
Android 設計 Activity 之間的轉場動畫大致有下列三類方法:
- overridePendingTransition
- ActivityOptionsCompat
- Theme Style
overridePendingTransition
這是 Android 典型的方法。首先在 res/anim/ 目錄下建立 xml 檔來自訂動畫
然後分別在 startActivity 下一行以及下一個 Activity 的 finish() 函式中加上 overridePendingTransition 即可呈現兩個 Activities 之間來回的轉場動畫。
第一種方法的好處是直覺、自訂性高、且相容性高;缺點則是要分別在每個 startActivity 和 finish() 加上程式碼,不免覺得繁瑣。當程式碼量大的時候就不容易整理各個 Activity 之間的邏輯。
ActivityOptionsCompat
這是在 Android 5.0 後加入的新方法,也能向下相容舊版本。用法是先宣告一個 ActivityOptionsCompat,並選擇它內建的方法去設定 xml,然後把它加入在 startActivity 的引數中即可。
至於返回的動畫則是在下一個 Activity 中加入 finishAfterTransition 這行來結束 Activity(相當於先執行動畫再 finish())。
但卻發現直接這樣寫是沒有作用的!!
查了一下網路後,發現似乎是還要設定叫做「共享元素」的東西。這部份比較複雜,因此尚未研究清楚......
而 ActivityOptionsCompat 還有內建一些符合 Material Design 設計的動畫,如果只需要著重在進入轉場又懶得自訂 xml 的話則可以使用它們做出美觀的動畫。
ActivityOptionsCompat.makeClipRevealAnimation(View source, int startX, int startY, int width, int height)
ActivityOptionsCompat.makeScaleUpAnimation(View source, int startX, int startY, int startWidth, int startHeight)
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY)
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, Pair...<View, String> sharedElements)
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
Theme Style
第三種則是利用 styles.xml 設定自訂動畫,再指定該 Activity 的 Theme 來套用。不過在使用這個方法時碰到了許多意料外的行為,所以對各種 key name 所代表的意義有疑惑。而且查了很多資料也看不懂敘述,只好自己嘗試整理出了下圖的規則:
這意思是說,假如我們對 B 設定 Theme,那麼動畫會在 A 進入 B,或者 C 返回 B 的情況下才有作用。因此各個 key name 的意義就如註解所示。
總結
整體來說,overridePendingTransition 可以在任何情境下使用,但需要逐一設定;
ActivityOptionsCompat 則是可以輕鬆使用內建的 Material Design 風格動畫,但正規的返回動畫實現方式還沒有弄清楚,可以使用 overridePendingTransition 來彌補;
設定 Theme 的方式則比較適合在該 Activity 無論在什麼情況下進入都要給予固定的動畫效果時使用。
設定 Theme 的方式則比較適合在該 Activity 無論在什麼情況下進入都要給予固定的動畫效果時使用。
留言
張貼留言