Compose 除了在架構上有很高的彈性外,在外觀上也給開發者很大的自由。由於 Jetpack Compose 是先針對 Android 作業系統而設計的,因此原生的 Theme(佈景主題)是遵循 Material Design 而設計的。若有客製化的需求,只要依照官方文件的說明,開發者也能打造符合需求的自訂主題。
由於 Compose for Desktop 的運行環境是 Desktop 作業系統,也就是 macOS、Windows、Linux。雖然在這個跨平台技術盛行的年代,使用者已經習慣在不同作業系統上看到各式主題的 UI,但若要給使用者最好的體驗,能讓 UI 看起來像原生的是再好不過了。
筆者在 Github 上搜尋了一下,果然已經有開發者嘗試為 Compose 實作 masOS 佈景主題。今年的耕讀筆記,就要來實驗一下更換佈景主題的效果。
Carson Holzheimer 在 Github 上公佈了他為 Compose 實作的 masOS 佈景主題,只要在專案裡新增一行相依套件設定,就能取用 MacTheme 及數個 Mac 開頭的元件。首先打開專案的 build.gradle.kts,找到 kotlin 底下的 sourceSets 設定,在 jvmMain 裡新增 io.github.chozzle:compose-macos-theme-desktop:
kotlin {
    // ...
    sourceSets {
        val jvmMain by getting {
            dependencies {
                // ...
                implementation("io.github.chozzle:compose-macos-theme-desktop:0.4.2")
                // ...
            }
        }
        // ...
    }
}
安裝好相依套件後,只要把原本寫在 MaterialTheme 的元件,改放到 MacTheme 底下,整個 Look & Feel 就會換成 macOS 風格啦!
MacTheme {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center,
    ) {
        Column {
            Text(
                text = "Count: $count",
            )
            Row {
                MacButton(
                    macButtonStyle = MacButtonStyle.Large,
                    onClick = { count++ }
                ) {
                    Text(
                        text = "Add"
                    )
                }
                MacButton(
                    macButtonStyle = MacButtonStyle.Large,
                    onClick = { count = 0 }
                ) {
                    Text(text = "Reset")
                }
            }
        }
    }
}
從上面的例子可以看到,這個套件還另外提供許多 Mac 開頭的元件,比方說 MacButton,另外還有像 MacCheckbox、MacRadioButton、MacSearchField…等。想要了解更多的讀者,可以在 UI 裡放一個 MacExampleView 元件,就可以看到套件作者準備的示範 UI。
在這個幾乎所有應用程式都 Web 化的時代,到底還有什麼情境會寫 Desktop App 呢?答案之一就是打造 Compose for Desktop 的公司 JetBrains 在做的事 - 做 IDE!在經歷 20 年的 IDE 開發之後,JetBrains IDE 所創造出來的 UI 風格也廣為人知。既然 Compose 能支援自訂佈景主題,那能拿來做出 JetBrains IDE 風格的 UI 嗎?
當然可以!在 Github 就可以找到 JetBrains UI Kit for Compose Desktop 專案,一樣在專案裡安裝相依套件後就可以有 JBTheme 及 J 開頭的元件使用,打開專案的 build.gradle.kts,找到 kotlin 底下的 sourceSets 設定,在 jvmMain 裡修改 compose.desktop.currentOs 的設定,並新增 io.github.chozzle:compose-macos-theme-desktop:
kotlin {
    // ...
    sourceSets {
        val jvmMain by getting {
            dependencies {
                // ...
                implementation("com.bybutter.compose:compose-jetbrains-theme:1.1.0")
                // ...
            }
        }
        // ...
    }
}
安裝好相依套件後,只要把原本寫在 MaterialTheme 的元件,改放到 JBTheme 底下,整個 Look & Feel 就會換成 JetBrains IDE 風格啦!
JBTheme {
    JPanel(
        modifier = Modifier.fillMaxSize()
                           .jBorder(top = 1.dp, color = JBTheme.panelColors.border)
    ) {
        // ...
    }
}
經過今天的兩個範例,相信讀者都能感受到 Compose Theme 的美妙之處。隨著 Compose for Desktop 更趨穩定,相信會有更多成熟的佈景主題可以套用。在開發多平台應用程式時,將可以提供使用者更好的體驗。