Android 簡易實現轉場動畫
簡介
在Android APP中進行頁面切換的時後,如果沒有特別設定,使用者只會看見新的頁面由下往上快速彈出,Android 5.0後可以使用Activity transition APIs來完成轉場動畫,加入轉場動畫後可以將兩個頁面之間的元件連接,產生元件與使用者互動的感覺而不是單純的切換頁面。
這裡的轉場指的是當APP的頁面進行切換的時候所發生的變化,例如從A Activity使用startActivity(intent)跳轉到B Activity的過程中,兩個Activity的Layout及其中的元件所展現的漸變過程。
設定
在res/styles.xml中進行設定告知系統要使用transition :
或者也可以在要使用轉場動畫的Activity中加入這行程式碼.這裡有一點要注意,這行程式碼必須在setContentView()之前加入,否則會出現錯誤訊息。
完成一次的轉場包含了:
離開頁面A時要發生的事。
進入頁面B時要發生的事。
而這個要發生的事也就是我們想實現的動畫了。Transition API提供三個基本的動畫讓我們來使用:
1.Fade : 變更屬性Alpha的值達到漸入漸出的效果。
2.Slide : 變更座標實現滑動效果。
3.Explode : 由畫面的中心向四周移動至畫面外,或由四周向中心聚集。
這裡需要添加一個資料夾及xml檔來完成動畫設定。
建立好資料夾及xml檔後再回到styles.xml設定何時啟用哪種動畫。
也可以直接在Activity中設定進入頁面以及離開頁面的動畫。
使用
實際使用轉場動畫需要在startActivity()添加ActivityOption.makeSceneTransitionAnimation(this).toBundle()。
上面是針對頁面所做的動畫,而Transition 能做到的不只如此,我們還能針對畫面中的元件設定動畫,這個被設定的元件叫做shared element,只要在兩個不同的layout中對元件設定android:transitionName=""這個屬性即可,在兩個layout中擁有相同transitionName的元件會產生對應,他們代表著這個元件一開始的樣子以及最後的樣子,有點類似於flash中的補間動畫,我們只需要告訴系統元件一開始和最後的位置、大小,系統會幫我們補足中間的畫面。
對shared element可以使用另外四種動畫:
changeBounds:對目標View的邊界變化做動畫。
changeClipBounds:對目標View的裁切邊界變化做動畫。
changeTransform:對目標View的縮放變化以及旋轉角度變化做動畫。
changeImageTransform:對目標Image的大小差異和縮放變化做動畫。
設定styles.xml
要載入的動畫
在兩個layout中設定 transitionName
在Activity中指定轉場動畫的元件
在這個範例中我們把設定放在styles.xmll裡,所以BigActivity.class就不需要再多做什麼設定了.
範例
看得出來嗎?這裡已經換了一頁了喔.
說實話,一開始練習這四個種類的動畫時沒有感受到很明顯的差異,如果想要實際瞭解這些效果,建議製作幾個畫面差異較大的頁面去嘗試,比較能看出動畫各自的效果。
我們可以對不只一個元件做動畫,只要兩個頁面有對應彼此的transitionName就行了,設定多個元件的範例如下
在兩個layout上設定transitionName對應元件:
轉場起始頁面的設定,這裡就不同了,要使用Pair.create().
接著是轉場的終止頁面,這裡可以比較單純一點,告訴頁面要使用什麼動畫就好.
成果如下
補充
如果你曾看過官方的文件也許你有注意到,官方的範例在設定styles.xml的時候,讓Activity使用的Theme是”android:Theme.Material”,那麼如果不使用這個Theme是不是就不能使用動畫了呢?答案是”仍然可以使用動畫”,但是可能會產生一些讓你覺得怪異的現象.我在練習時遇到過一個,情境是這樣的,首先製作了一個離開的動畫設定為Explode,接著在A layout上面用LinearLayout切出4x4的格子並填上不同的顏色,根據Explode的效果應該會看到16個格子由中心向畫面四周散開的效果,結果散是散了卻沒有16個格子都散,看起來像是分成上下兩個部分各自滑出畫面,後來改了Theme才看到我要的效果.如果你也遇到了這種狀況不妨試著改變Theme或是變更你的layout切割的方式(橫向分割改成縱向分割).或許就能做出你要的效果了.
參考
https://developer.android.com/training/transitions/start-activity