KC Blog

來學習Jetpack Compose 在splash頁面加入動畫吧!

7 min read
UIFramework#Android#Compose#Kotlin

目標

這篇目標會是做出一個

簡單的splash 頁面

我們今天最後達成的目標會是這樣:

前言

現在許多應用程式都會設計一個進入畫面,

以便讓用戶清楚地識別當前的應用程式或公司標誌,

確保用戶知道他們正在使用的是哪個應用程式。

在本篇文章中,

我們將重點介紹如何實現一個簡單的跳轉功能,

並配合簡單的水平擴展動畫,

來達到今天的目標。

如果你對Jetpack Compose的基礎還不熟悉,

可以參考這篇文章以加深理解:

這篇開始時,已經假設會基本概念了,所以還沒了解的可以參考上面那篇。

第一步:想好頁面架構
首先,

我們需要先考慮這個頁面的整體結構。

通常習慣先想像最終畫面的樣子,

因此我透過使用一個Box元件作為不同圖層的概念來區分各個區塊。

第二步 : 實作 splash頁logo動畫
在這一步中,我們將傳入一個函式型別的參數 event:()->Unit = {}

這樣我們就能在之後觸發某個外部呼叫所要執行的動作。

同時,

我們也可以預設動畫的進場與退場時間,

以及執行傳入動作前的延遲時間。

這些參數可以根據需求自行調整,

但為了方便理解,我們先將它們寫在函式內部。

根據具體情況,

我希望我的 Logo 在頁面正中央並稍微偏上一點,

所以我加入了 Column 元件,並使用 Modifier 調整相關位置。

你可以參考下方程式碼的#23~#34行,來調整相關位置。

第三步 : 本文重頭戲

現在我們將進入動畫的關鍵部分,

使用了 Jetpack Compose 的 AnimatedVisibility。

這個類提供了許多內建的方法,

讓我們能夠快速實現一些基本的動畫效果。

在這一部分,

我們先來看一下前面我們定義的一個 val 變數 state。

這是 Jetpack Compose 中經常使用的概念之一,

因為在單獨使用 Composable 寫程式碼時,

它不會自動在 XML 中進行更新。

要透過state告知composable更新

val state = remember {

    MutableTransitionState(false).apply {
        ...
    }
}

所以這邊用到 remember 來記住(儲存) MutableTransitionState 物件

這邊重點講一下 MutableTransitionState

它是一種包含了兩種狀態的 可觀察其狀態的項目

其中包含 currentStatetargetState

根據官方解釋

當可觀察的state狀態改變時

會觸發系統讓compose去重組

所以我們可以利用這個特性

去實時變更我們compose元件的內容

例如我這邊的例子是:

1.先宣告一個staus 初始狀態為 false

2.在使用AnimatedVisibility設定該visibleState為我剛剛宣告的staus

3.回到剛剛宣吿val staus的地方加入apply

其中概念是

利用了kotlin extension 概念apply去執行scope內的code

因apply可以取得父類內的特性

所以設定MutableTransitionState內的targetState變為ture

此舉動會讓MutableTransitionState發生改變 所以使用該staus的會觸發上方說過的特性

讓我們開發時有依據去判斷何時要改變compose

val state = remember {

        MutableTransitionState(false).apply {
            // Start the animation immediately.
            targetState = true

            ...

        }
    }

也就是說,

使用上面方法觸發動畫

觸發後同時觸發Handler去執行跳轉的動作:

val state = remember {
        MutableTransitionState(false).apply {
            // Start the animation immediately.
            targetState = true

            Handler(Looper.getMainLooper()).postDelayed({
                event.invoke()
            }, delayMillis)

        }
    }

接下來,

我們將開始進行動畫的製作。

在這裡,

我們同樣使用了 Jetpack Compose 的庫,

具體來說是使用了 AnimatedVisibility。

在這個函式中,我們使用了以下幾個變數:

1.visibleState:這是控制動畫顯示狀態的變數。

透過前面提到的 remember 和 MutableTransitionState,

我們能夠觸發這個庫的動畫效果。

換句話說,當該狀態改變時,這個函式就會再次執行。

2.enter:這個變數用於定義動畫進場的效果。

3.exit:這個變數用於定義動畫退場的效果。

透過設定這些變數,

我們能夠控制動畫的出現與消失,

從而營造出令人驚艷的視覺效果。

理解上面後,就可以用官方提供的幾種內建動畫套入

進場使用 expandHorizontally

出場使用 fadeOut

也就是說在 enter與exit分別帶入要的動畫如下:

AnimatedVisibility(
          visibleState = state,
          enter = expandHorizontally(
              animationSpec = tween(
                  durationMillis = startDurationMillis,
                  easing = LinearEasing
              ),
          ),
          exit = fadeOut(
              animationSpec = tween(
                  durationMillis = exitDurationMillis,
                  easing = LinearEasing
              ),
          )
      ){
        ...
      }

接著,

在 AnimatedVisibilityScope 的函式型別範圍內,

你可以加入你想要顯示的元件,

這樣就能呈現出動畫效果了。

最終成品,範例程式碼