可組合項是由函式定義,並加上 @Composable
註解:
@Composable fun SimpleComposable() { Text("Hello World") }
如要啟用這個可組合項的預覽功能,請建立另一個可組合元件,並加上 @Composable
和 @Preview
註解。這個新的加註可組合項現在包含您最初建立的可組合項 SimpleComposable
:
@Preview @Composable fun SimpleComposablePreview() { SimpleComposable() }
@Preview
註解會指示 Android Studio 此可組合項應顯示在這個檔案的設計檢視畫面中。您可以在進行編輯時,查看可組合項預覽的即時更新。
您可以在程式碼中手動新增參數,以自訂 Android Studio 轉譯 @Preview
的方式。您甚至可以多次將 @Preview
註解新增至同一個函式,以便預覽具有不同屬性的可組合項。
使用 @Preview
可組合項的主要優點之一,就是避免依賴 Android Studio 中的模擬器。您可以儲存會耗用大量記憶體的模擬器啟動作業,進行更多最終的外觀和風格變更,同時 @Preview
能輕鬆變更和測試小幅程式碼變更。
為了充分發揮 @Preview
註解的效用,請務必根據系統接收的輸入狀態及其輸出的事件來定義畫面。
定義@Preview
Android Studio 提供了幾項可擴展組件預覽畫面的功能。您可以變更預覽畫面的容器設計、與它們進行互動,或是直接將預覽畫面部署到模擬器或裝置中。
尺寸
根據預設,系統會自動選擇可包覆內容的 @Preview
尺寸。如要手動設定維度,請新增 heightDp
和 widthDp
參數。這些值已經解譯為 dp
,因此您不必在它們中加入 .dp
:
@Preview(widthDp = 50, heightDp = 50) @Composable fun SquareComposablePreview() { Box(Modifier.background(Color.Yellow)) { Text("Hello World") } }
動態色彩預覽
如果已在應用程式中啟用動態色彩,請使用 wallpaper
屬性切換桌布,查看 UI 如何回應不同使用者所選的桌布。請選取 Wallpaper
類別提供的不同桌布主題。這項功能需要 Compose 1.4.0 以上版本。
搭配不同裝置使用
在 Android Studio Flamingo 中,您可以編輯 Preview 註解的 device
參數,定義可組合項在不同裝置上的設定。
如果裝置參數含有空白字串 (@Preview(device = "")
),您可以按下 Ctrl
+ Space
來叫用自動完成功能。然後設定每個參數的值。
透過自動完成功能,您可以從清單中選取任何裝置選項,例如 @Preview(device = "id:pixel_4")
。或者,您可以選擇 spec:width=px,height=px,dpi=int…
設定每個參數的個別值,藉此輸入自訂裝置。
如要套用,請按 Enter
,或是使用 Esc
取消。
如果設定無效的值,宣告會以紅色底線標示,可能也有修正結果 (Alt
+ Enter
(在 macOS 為 ⌥ + ⏎) > Replace with ...)。檢查作業會嘗試提供最接近輸入內容的修正。
語言代碼
如要測試不同的使用者語言代碼,請新增 locale
參數:
@Preview(locale = "fr-rFR") @Composable fun DifferentLocaleComposablePreview() { Text(text = stringResource(R.string.greeting)) }
設定背景顏色
根據預設,可組合項會以透明背景顯示。如要新增背景,請新增 showBackground
和 backgroundColor
參數。請注意,backgroundColor
是 ARGB Long
,而非 Color
值:
@Preview(showBackground = true, backgroundColor = 0xFF00FF00) @Composable fun WithGreenBackground() { Text("Hello World") }
系統 UI
如果您需要在預覽畫面中顯示狀態和動作列,請新增 showSystemUi
參數:
@Preview(showSystemUi = true) @Composable fun DecoratedComposablePreview() { Text("Hello World") }
UI 模式
uiMode
參數可採用任何 Configuration.UI_*
常數,並可讓您據此變更預覽的行為。舉例來說,您可以將預覽畫面設為夜間模式,看看主題的回應方式。
LocalInspectionMode
您可以讀取 LocalInspectionMode
CompositionLocal
,查看可組合項是否在預覽畫面中算繪 (位於可檢查元件內)。如果已在預覽畫面中算繪組合,LocalInspectionMode.current
會評估為 true
。這項資訊可讓您自訂預覽畫面;舉例來說,您可以在預覽視窗中顯示預留位置圖片,而非顯示實際資料。
您也可以藉此規避限制。例如,顯示範例資料,而非呼叫網路要求。
@Composable fun GreetingScreen(name: String) { if (LocalInspectionMode.current) { // Show this text in a preview window: Text("Hello preview user!") } else { // Show this text in the app: Text("Hello $name!") } }
與@Preview
互動
Android Studio 提供多項功能,可讓您與已定義的預覽畫面互動。這項互動有助於瞭解預覽的執行階段行為,進而使用預覽功能更妥善地瀏覽 UI。
互動模式
互動模式可讓您使用類似在執行程式的裝置 (例如手機或平板電腦) 上的預覽互動方式。互動模式位於沙箱環境中 (這是與其他預覽隔離),您可以在預覽畫面中點選元素及輸入使用者輸入內容。藉由這種方式,您可以快速測試可組合項中的不同狀態、手勢,甚至是動畫。
程式碼導覽與組件概述
將滑鼠遊標懸停在預覽畫面上,即可查看其中所含可組合項的概述。按一下組件概述,會觸發編輯器檢視畫面,供您查看定義。
執行預覽
您可以在模擬器或實體裝置上執行特定 @Preview
。預覽是以新的 Activity
部署在相同的專案應用程式中,因此會共用相同的結構定義和權限。如果已經授予權限,則您不需要編寫樣板程式碼來要求權限。
在 @Preview
註解旁邊或預覽頂端按一下「Run Preview」圖示 ,Android Studio 會將 @Preview
部署至已連結的裝置或模擬器。
複製 @Preview
算繪
在任何算繪出的預覽畫面上按一下滑鼠右鍵,即可複製為圖片。
同一個 @Preview
註解的多重預覽
您可以展示相同 @Preview
可組合項的多個版本 (規格不同),或將不同參數傳遞至可組合項。這樣一來,您就能減少需另外編寫的樣板程式碼。
多重預覽範本
androidx.compose.ui:ui-tooling-preview
1.6.0-alpha01+ 推出了 Multipreview API 範本:@PreviewScreenSizes
、@PreviewFontScales
、@PreviewLightDark
和 @PreviewDynamicColors
,因此只要使用單一註解,即可在常見情境中預覽 Compose UI。
建立自訂多重預覽註解
使用多重預覽時,您可以定義註解類別,且其本身俱有多個使用不同設定的 @Preview
註解。將此註解新增至可組合函式後,就會自動一次轉譯所有不同的預覽。舉例來說,您可以使用此註解同時預覽多種裝置、字型大小或主題,不需要針對每一個可組合項重複這些定義。
首先,請建立您的自訂註解類別:
@Preview( name = "small font", group = "font scales", fontScale = 0.5f ) @Preview( name = "large font", group = "font scales", fontScale = 1.5f ) annotation class FontScalePreviews
您可以針對預覽組件使用此自訂註解:
@FontScalePreviews @Composable fun HelloWorldPreview() { Text("Hello World") }
您可以合併多重預覽註解和一般預覽註解,以建立更完整的預覽組合。合併多重預覽註解並不代表會顯示其他不同的組合。因此,每個多重預覽註解都會分開運作,並且只會顯示各自的變化版本。
@Preview( name = "Spanish", group = "locale", locale = "es" ) @FontScalePreviews annotation class CombinedPreviews @CombinedPreviews @Composable fun HelloWorldPreview2() { MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } } }
多重預覽和一般預覽的混合與比對特性可讓您更全面地測試大型規模專案的許多屬性。
@Preview
和大型資料集
通常,您需要將大型資料集傳遞至可組合項預覽。方法很簡單,只要將範例資料傳送到「組件預覽」函式,即可新增含有 @PreviewParameter
註解的參數。
@Preview @Composable fun UserProfilePreview( @PreviewParameter(UserPreviewParameterProvider::class) user: User ) { UserProfile(user) }
如要提供範例資料,請建立可實作 PreviewParameterProvider
並以序列傳回範例資料的類別。
class UserPreviewParameterProvider : PreviewParameterProvider<User> { override val values = sequenceOf( User("Elise"), User("Frank"), User("Julia") ) }
這樣做會為序列中的每個資料元素算繪一個預覽:
您可以將同一個提供者類別用於多個預覽。如有需要,請設定限制參數來限制預覽數量。
@Preview @Composable fun UserProfilePreview2( @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User ) { UserProfile(user) }
限制與最佳做法
Android Studio 會直接在預覽區域執行預覽程式碼。不需要執行模擬器或實體裝置,因為這類元件利用名為 Layoutlib
的 Android 架構中已移植的部分。Layoutlib
是 Android 架構的自訂版本,專為在 Android 裝置外執行而設計。程式庫的目標是在 Android Studio 中預覽與裝置轉譯內容非常相似的版面配置。
預覽限制
由於預覽在 Android Studio 中算繪的方式,因此較輕量,且無需透過整個 Android 架構進行算繪。不過,這會產生下列限制:
- 沒有網路存取權
- 沒有檔案存取權
- 可能無法完整使用某些
Context
API。
預覽和ViewModels
在可組合項中使用 ViewModel
時,預覽功能會受到限制。預覽系統無法建構所有傳遞至 ViewModel
的參數,例如存放區、用途、管理程式或類似項目。此外,如果您的 ViewModel
加入依附元件插入 (例如使用 Hilt),預覽系統無法建構整個依附元件圖表來建構 ViewModel
。
當您嘗試使用 ViewModel
預覽可組合項時,Android Studio 會在轉譯特定可組合項時顯示錯誤:
如果想預覽使用 ViewModel
的可組合項,則應使用 ViewModel
中的參數做為可組合項的引數傳遞的可組合項。這樣一來,您就無需預覽使用 ViewModel
的可組合項。
@Composable
fun AuthorColumn(viewModel: AuthorViewModel = viewModel()) {
AuthorColumn(
name = viewModel.authorName,
// ViewModel sends the network requests and makes posts available as a state
posts = viewModel.posts
)
}
@Preview
@Composable
fun AuthorScreenPreview(
// You can use some sample data to preview your composable without the need to construct the ViewModel
name: String = sampleAuthor.name,
posts: List<Post> = samplePosts[sampleAuthor]
) {
AuthorColumn(...) {
name = NameLabel(name),
posts = PostsList(posts)
}
}
註解類別 @Preview
您隨時可以在 Android Studio 中按下「ctrl」或「⌘」按鈕,同時點選 @Preview
註解,以取得完整的參數清單,您可以在自訂預覽畫面時調整這些參數。
annotation class Preview( val name: String = "", val group: String = "", @IntRange(from = 1) val apiLevel: Int = -1, val widthDp: Int = -1, val heightDp: Int = -1, val locale: String = "", @FloatRange(from = 0.01) val fontScale: Float = 1f, val showSystemUi: Boolean = false, val showBackground: Boolean = false, val backgroundColor: Long = 0, @UiMode val uiMode: Int = 0, @Device val device: String = Devices.DEFAULT, @Wallpaper val wallpaper: Int = Wallpapers.NONE, )
其他資源
如要進一步瞭解 Android Studio 如何提倡 @Preview
使用便利性,並瞭解更多工具秘訣,請參閱 Compose 工具網誌。
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 使用 CompositionLocal 的本機範圍資料
- Compose 中的質感設計 2
- 在 Compose 中使用 View