Compose 清單和動畫

Kimoji:以 Jetpack Compose 實作一款「心情日記」應用 [7]

John Lu
5 min readSep 4, 2022

清單和動畫會出現在 app 中的任何地方。在本文章中,我們將瞭解如何運用 Compose 輕鬆建立清單,並增添動畫效果。

此系列文章是以我的業餘專案: Kimoji 為範例。
這款以純 Jetpack Compose 撰寫的 side project,已經在 Google Play 上架。 歡迎試玩!
📥 立馬下載 | | | 🎟️ 索取兌換碼

建立日記列表

只顯示一篇日記會感覺有點孤單,因此我們可以新增「日記本」以便包含多篇日記。我們必須建立 Journal 函式,以顯示多篇日記。針對這個使用情境,我們用 Compose 的 LazyColumnLazyRow。這些 composable 只會 render 螢幕上可視的元件,因此這些 composable 的設計,對於較長的清單來說,可以得到非常優良的效能。

在下面這段程式碼中,我們可以看到 LazyColumn 含有一個 child items。它接受 List 做為參數,而他的 lambda 會收到一個叫做 diary 的參數(可以隨意為其命名),也就是 Diary 的實體。 簡單來說,List 中的每個 item 都會呼叫這個 lambda。將這份範例資料匯入我們的專案,即可快速建構日記本。

展開日記時顯示動畫效果

我們的日記現在變得更豐富了。現在是時候製作動畫了!我們將新增展開日記來顯示更多內容的功能,同時為內容大小和背景顏色製作動畫效果。如要儲存此 local UI state,我們必須記住日記是否已展開。我們必須使用 remembermutableStateOf 函式來追蹤這種狀態變化。

Composable functions 可以使用 remember 將 local state 儲存在記憶體中,並觀察 mutableStateOf 之 value 的變化。該值更新時,系統會自動重新繪製有讀取這個狀態的 composables (和他們的 children)。這就稱為recomposition

透過使用 Compose 的狀態 API(例如 remembermutableStateOf),系統會在狀態發生任何變更時自動更新 UI。

注意:我們必須新增下列的 import,才能正確使用 by。按 Alt + Enter 或 Option + Enter 鍵,即可新增這些項目。

import androidx.compose.runtime.getValue

import androidx.compose.runtime.setValue

現在,當按一下日記時,即可根據 isExpanded 變更筆記內容的背景。我們將使用 clickable modifier 來處理 composable 中的點擊事件。這次我們不需要再切換 Surface 的背景顏色,而是以動畫方式逐步將背景顏色從 MaterialTheme.colors.surface 變更為 MaterialTheme.colors.primary(反之亦然)。為了做到這點,我們將使用 animateColorAsState 函式。最後,使用 animateContentSize modifier,流暢地為筆記大小製作動畫:

Recap

在前 4 篇文章中,我們已經完成 Compose 的基本教學!我們已經建構了一個簡單的日記本畫面,可以有效率地顯示包含 emoji 和文字的日記列表,而且還有展開動畫。我們還套用了 Material Design、深色主題,還有 preview功能,一切只需要不到 100 行程式碼!

我們目前已介紹的內容如下:

  • 定義 composable functions
  • 在 composable 中新增不同元件
  • 使用排版元件建構 UI
  • 使用 modifiers 裝飾 composables
  • 建立良好效能的清單
  • 觀察並修改狀態
  • 在 composable 上新增使用者互動
  • 在展開時為日記加入動畫效果

在接下來幾天的文章中,如要您想要深入瞭解哪些題目,歡迎在下方留言。

此系列文章是以我的業餘專案: Kimoji 為範例

Kimoji 是一款心情日記 App,讓你用可愛的 emoji 來撰寫你的心情日記。現在就來試試這款設計精美的微日記吧!
📥 立馬下載 | | | 🎟️ 索取兌換碼

--

--

John Lu
John Lu

Written by John Lu

AI Engineer. Deeply motivated by challenges and tends to be excited by breaking conventional ways of thinking and doing. He builds fun and creative apps.

No responses yet