Jetpack Compose 【一】入門:擁抱現代 Android UI 開發

一、什么是 Jetpack Compose?

Jetpack Compose 是 Google 推出的現代 Android UI 開發框架,它基于 聲明式 UI 編程范式,旨在簡化界面開發流程,讓開發者能夠更直觀、高效地構建 UI。

聲明式 UI vs 傳統 View

傳統 Android UI 采用的是 命令式 方式,開發者需要在 XML 中定義界面結構,并在 Activity 或 Fragment 里手動操作 View 的屬性來更新 UI。而 聲明式 UI(Declarative UI)模式下,我們只需描述 最終的界面狀態,Compose 會自動處理界面更新。

**Jetpack Compose 的特點:

  • ? 純 Kotlin 編寫 UI:不再需要 XML,UI 與邏輯統一管理,提升開發效率。
  • ? 基于組件組合:通過可組合函數 (@Composable) 復用 UI 代碼,提高可維護性。
  • ? 自動 UI 更新:狀態變化時,Compose 只會重新繪制受影響的組件,避免不必要的計算,提高性能。
  • ? 與傳統 View 兼容:支持與現有 View 系統混合使用,漸進式遷移更簡單。

聲明式 UI 代表技術: Jetpack Compose(Android)、SwiftUI(iOS)、Flutter(跨平臺)。


二、為什么要選擇 Compose?

Jetpack Compose 具備多方面的優勢,使其成為未來 Android UI 開發的首選。

1?? 更少的代碼量

Compose 允許我們使用更少的代碼完成相同的 UI 任務。例如,傳統 XML + ViewBinding 需要大量模板代碼,而 Compose 直接用 Kotlin 代碼描述 UI 結構,代碼更簡潔。

示例:一個簡單的按鈕

XML + ViewBinding

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me" />
val button = findViewById<Button>(R.id.button)
button.setOnClickListener { 
    Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show()
}

Compose 實現

Button(onClick = { 
    Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show()
}) {
    Text("Click Me")
}

Compose 代碼更直觀,省去了 findViewById 以及 ViewBinding 的繁瑣邏輯。

2?? 高性能渲染

Compose狀態發生變化時,只有受影響的可組合函數會重新執行,避免了不必要的計算和渲染,從而提高了性能。

3?? 強大的開發工具支持

Compose 提供了一系列現代化工具:

  • ? 實時預覽(@Preview):無需運行 App,直接在 Android Studio 預覽 UI。
  • ? 動畫編輯器:可視化調整 Compose 動畫,提升開發體驗。
  • ? Layout Inspector:檢查 UI 組件層級,調試界面更方便。

三、Compose 基礎 UI 組件詳解

1?? Text 組件

Text 組件用于顯示文本內容,可以通過 fontSizecolorfontWeight 等屬性進行樣式定制。除了基本的樣式,你還可以添加 maxLines 來控制最大行數,overflow 來定義文本溢出的行為。

Text(
    text = "Hello, Jetpack Compose!",
    fontSize = 20.sp,
    color = Color.Blue,
    fontWeight = FontWeight.Bold,
    maxLines = 1,
    overflow = TextOverflow.Ellipsis
)

Text 組件常用于顯示標題、段落或任何需要呈現的文本內容。你還可以結合 Modifier 來調整文本的對齊方式和位置。

2?? Button 組件

Button 組件用于觸發用戶交互事件,可以包裹任何子組件。通常,按鈕內會包含一個 Text 或圖標,按鈕的樣式(如背景色、形狀等)可以通過 Modifier 來定制。

Button(
    onClick = { /* 執行操作 */ },
    shape = RoundedCornerShape(8.dp),
    colors = ButtonDefaults.buttonColors(backgroundColor = Color.Blue)
) {
    Text("Click Me", color = Color.White)
}

如果需要更復雜的交互,比如禁用按鈕或根據條件變更按鈕的樣式,可以在 onClick 事件中添加邏輯。

3?? Image 組件

Image 組件用于顯示圖片,可以通過 painterResource 加載資源圖片,或者使用 rememberImagePainter 來加載網絡圖片。contentDescription 是輔助功能的重要屬性,便于屏幕閱讀器識別圖片內容。

Image(
    painter = painterResource(id = R.drawable.ic_launcher_foreground),
    contentDescription = "App Icon",
    modifier = Modifier.size(80.dp).clip(CircleShape)
)

這里我們對 Image 進行了裁剪,變成了圓形的圖標, modifier 可以進一步用于調整圖片的大小、形狀和布局。

4?? Column & Row 組件(布局容器)

ColumnRow 用于垂直和水平排列組件。你可以通過 horizontalAlignmentverticalArrangement 來控制布局內的對齊方式。

Column(
    verticalArrangement = Arrangement.spacedBy(10.dp),
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Text("Item 1")
    Text("Item 2")
    Text("Item 3")
}

Row(
    horizontalArrangement = Arrangement.spacedBy(15.dp),
    verticalAlignment = Alignment.CenterVertically
) {
    Text("Left")
    Text("Right")
}

這兩個布局容器非常適合用于排版列表項、按鈕組等常見布局。

5?? Box 組件(類似Framelayout)

Box 組件非常適合用于重疊視圖的情況。你可以在 Box 中放置多個組件,它們會按層疊的方式排列。

Box(
    modifier = Modifier.size(100.dp).background(Color.Gray)
) {
    Text(
        text = "Overlay Text",
        modifier = Modifier.align(Alignment.Center),
        color = Color.White
    )
}

通過 Modifier.align() 可以精確控制子組件的對齊方式。在圖像和文本重疊顯示時,Box 非常實用。

四、Modifier 使用指南

Modifier 是 Compose 中的一個重要工具,它允許你控制組件的樣式、行為和布局。可以用于修改組件的大小、間距、背景、對齊方式等。

1?? 基本用法

Modifier 可用于調整 UI 組件的外觀和行為。例如,你可以通過 paddingfillMaxSize 等方法來改變布局。

Text(
    "Hello, Compose!",
    modifier = Modifier
        .padding(16.dp)
        .background(Color.LightGray)
        .fillMaxWidth()
)

上面的代碼會給 Text 組件添加一個 16dp 的內邊距,背景色為淺灰色,寬度充滿父容器。

2?? 高級用法

Modifier 還可以用于處理更復雜的布局需求,比如響應點擊事件、拖動等:

Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Red)
        .clickable { /* 響應點擊事件 */ }
)

在這里,我們為 Box 添加了點擊事件,點擊時會觸發某個操作。


三、Compose 基礎 UI 組件詳解

1?? Text 組件(文本)

Text 組件用于顯示文本內容,可以通過 fontSizecolorfontWeight 等屬性進行樣式定制。你還可以使用 maxLines 來控制最大行數,overflow 來定義文本溢出的行為。

Text(
    text = "Hello, Jetpack Compose!",
    fontSize = 20.sp,
    color = Color.Blue,
    fontWeight = FontWeight.Bold,
    maxLines = 1,
    overflow = TextOverflow.Ellipsis
)
  • fontSize:設置字體大小。
  • color:設置文本顏色。
  • fontWeight:設置文本粗細。
  • maxLines:限制文本最大顯示行數。
  • overflow:控制文本超出部分的顯示方式,如 TextOverflow.Ellipsis 表示溢出部分顯示省略號。

2?? Button 組件(按鈕)

Button 組件用于觸發用戶交互事件。你可以通過 onClick 設置按鈕的點擊事件,并通過 Modifier 調整按鈕的樣式(如背景色、形狀等)。

Button(
    onClick = { /* 執行操作 */ },
    shape = RoundedCornerShape(8.dp),
    colors = ButtonDefaults.buttonColors(backgroundColor = Color.Blue)
) {
    Text("Click Me", color = Color.White)
}
  • onClick:按鈕點擊時觸發的事件。
  • shape:設置按鈕的形狀,這里使用了圓角形狀。
  • colors:設置按鈕的背景色和其他顏色屬性。
  • Text:按鈕內的文本。

3?? Image 組件(圖片)

Image 組件用于顯示圖片,可以通過 painterResource 加載資源圖片,或者使用 rememberImagePainter 來加載網絡圖片。contentDescription 便于輔助功能的使用。

Image(
    painter = painterResource(id = R.drawable.ic_launcher_foreground),
    contentDescription = "App Icon",
    modifier = Modifier.size(80.dp).clip(CircleShape)
)
  • painter:加載圖片的來源。
  • contentDescription:輔助功能描述,幫助屏幕閱讀器識別圖片。
  • modifier:用于控制圖片的大小、形狀等樣式。

4?? Column & Row 組件(布局容器)

ColumnRow 是常用的布局容器。Column 用于垂直排列,Row 用于水平排列。你可以通過 horizontalAlignmentverticalArrangement 來控制組件對齊方式。

Column(
    verticalArrangement = Arrangement.spacedBy(10.dp),
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Text("Item 1")
    Text("Item 2")
    Text("Item 3")
}

Row(
    horizontalArrangement = Arrangement.spacedBy(15.dp),
    verticalAlignment = Alignment.CenterVertically
) {
    Text("Left")
    Text("Right")
}
  • verticalArrangement:設置豎直方向的排列方式。
  • horizontalArrangement:設置水平方向的排列方式。
  • verticalAlignmenthorizontalAlignment:控制子組件的對齊方式。

5?? Box 組件(層疊布局)

Box 組件用于重疊視圖,通常用于顯示疊加元素。通過 Modifier.align() 可以精確控制子組件的位置。

Box(
    modifier = Modifier.size(100.dp).background(Color.Gray)
) {
    Text(
        text = "Overlay Text",
        modifier = Modifier.align(Alignment.Center),
        color = Color.White
    )
}
  • modifier:設置 Box 組件的樣式,例如大小、背景色。
  • align:設置子組件的對齊方式,在此示例中為居中對齊。

四、Modifier 使用指南

Modifier 是 Compose 中非常核心的概念,它允許你對 UI 組件進行樣式、布局、行為等方面的修改。通過 Modifier,你可以調整組件的大小、間距、背景、對齊、狀態等特性。

1?? 基本用法

Modifier 最常見的用法是設置組件的外觀和布局屬性。常用的屬性包括 paddingbackgroundfillMaxSizesize 等。

Text(
    "Hello, Compose!",
    modifier = Modifier
        .padding(16.dp)
        .background(Color.LightGray)
        .fillMaxWidth()
)
  • padding:為組件設置內邊距。你可以指定四個方向的內邊距,或者統一設置。
  • background:設置組件的背景色,可以使用 Color 或者 Brush 來定義漸變色背景。
  • fillMaxWidth:讓組件的寬度充滿父容器。類似的屬性還有 fillMaxHeightfillMaxSize 等。

2?? 布局相關

Modifier 可以與布局容器(如 ColumnRowBox 等)結合使用,以控制組件的對齊和排列方式。

  • fillMaxWidthfillMaxHeight:使組件填充父容器的寬度或高度。
  • wrapContentSize:使組件的大小包裹其內容。
  • align:通過 Modifier.align() 可以控制組件在父容器中的對齊方式。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Gray)
) {
    Text(
        text = "Center",
        modifier = Modifier.align(Alignment.Center),
        color = Color.White
    )
}
  • align:用于設置子組件在 Box 內的對齊方式,這里是居中對齊。

3?? 狀態與交互

Modifier 還可以用來處理交互事件,例如響應點擊、拖動、滑動等。

  • clickable:使組件變得可點擊,并觸發點擊事件。
  • indication:用于顯示點擊、焦點等狀態的視覺效果。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Red)
        .clickable { /* 點擊事件 */ }
)
  • clickable:將組件變為可點擊,點擊時觸發相應事件。你可以傳遞 onClick Lambda 作為點擊事件的響應。
  • indication:與點擊效果結合,提供可視化反饋,例如點擊時的陰影效果。

4?? 變換與動畫

Modifier 還支持常見的變換操作,如旋轉、縮放、平移等,常用于動畫和動態效果。

  • graphicsLayer:控制旋轉、縮放、透明度等變換。
  • rotate:旋轉組件。
  • scale:縮放組件。
  • offset:偏移組件的位置。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Blue)
        .graphicsLayer(rotationZ = 45f) // 旋轉組件
)
  • graphicsLayer:用于對組件應用變換,如旋轉、縮放、透明度等。
  • rotationZ:旋轉角度。
  • scaleXscaleY:設置水平和垂直縮放比例。

5?? 圓形、圓角和裁剪

Modifier 允許你輕松將組件裁剪成圓形或圓角矩形,這對于實現現代 UI 效果非常有用。

  • clip:裁剪組件的形狀,例如圓形、圓角矩形等。
  • RoundedCornerShape:用于定義圓角的大小。
  • CircleShape:將組件裁剪為圓形。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Green)
        .clip(CircleShape) // 裁剪為圓形
        .border(2.dp, Color.Black) // 添加邊框
)
  • clip(CircleShape) :將組件裁剪為圓形。
  • clip(RoundedCornerShape(16.dp)) :將組件裁剪為圓角矩形,圓角半徑為 16.dp。
  • border:為組件添加邊框,可以與 clip 配合使用,確保圓角或圓形邊框效果。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Red)
        .clip(RoundedCornerShape(16.dp)) // 圓角裁剪
        .border(2.dp, Color.Black) // 添加邊框
)

6?? 陰影效果

Modifier 也可以為組件添加陰影效果,這通常與 clipbackground 配合使用,以增加層次感和視覺效果。

  • shadow:為組件添加陰影,可以設置陰影的半徑、顏色等。
Box(
    modifier = Modifier
        .size(100.dp)
        .background(Color.Yellow)
        .clip(RoundedCornerShape(16.dp)) // 圓角裁剪
        .shadow(8.dp, RoundedCornerShape(16.dp)) // 添加陰影
)
  • shadow:設置陰影的半徑,通常與 clip 配合使用來確保陰影與組件的形狀一致。

五、使用 LazyColumn 構建高效列表

LazyColumn 用于高效渲染大列表,按需加載數據,避免一次性創建所有子項,提高性能。

val items = listOf("Item1", "Item2", "Item3", "Item4")

LazyColumn {
    items(items.size) { index ->
        Text(items[index], modifier = Modifier.padding(16.dp))
    }
}

相比 RecyclerViewLazyColumn 省去了 Adapter 和 ViewHolder 邏輯,代碼更簡潔。同樣,它通過懶加載的方式僅渲染當前屏幕內可見的列表項,從而提升性能


結語

Jetpack Compose 作為 Android UI 未來的發展方向,不僅簡化了 UI 開發流程,還提供了更強的性能優化和更現代化的工具支持。本篇文章介紹了 Compose 的核心概念、基礎組件、Modifier 使用以及高效列表構建。下一步,我們將深入學習 Compose 的狀態管理,理解 remembermutableStateOf 以及 ViewModel 結合方式,敬請期待! ??

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容