動畫

Android 簡易實現轉場動畫

Jia-Ming 2019/11/28 14:33:07
4248

簡介

Android APP中進行頁面切換的時後,如果沒有特別設定,使用者只會看見新的頁面由下往上快速彈出,Android 5.0後可以使用Activity transition APIs來完成轉場動畫,加入轉場動畫後可以將兩個頁面之間的元件連接,產生元件與使用者互動的感覺而不是單純的切換頁面。

這裡的轉場指的是當APP的頁面進行切換的時候所發生的變化,例如從A Activity使用startActivity(intent)跳轉到B Activity的過程中,兩個ActivityLayout及其中的元件所展現的漸變過程。

 

設定

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

 

 

 

 

Jia-Ming