Jetpack Compose #

一、Compose概述 #

Jetpack Compose是Android的现代声明式UI框架,使用Kotlin代码构建UI,简化了Android UI开发。

1.1 Compose特点 #

  • 声明式UI
  • Kotlin代码构建
  • 实时预览
  • 兼容现有代码

1.2 添加依赖 #

kotlin
dependencies {
    implementation("androidx.compose.ui:ui:1.5.4")
    implementation("androidx.compose.ui:ui-tooling-preview:1.5.4")
    implementation("androidx.compose.material3:material3:1.1.2")
    implementation("androidx.activity:activity-compose:1.8.2")
    
    debugImplementation("androidx.compose.ui:ui-tooling:1.5.4")
}

二、基础组件 #

2.1 Text #

kotlin
Text(
    text = "Hello, Compose!",
    fontSize = 24.sp,
    fontWeight = FontWeight.Bold,
    color = Color.Blue,
    modifier = Modifier.padding(16.dp)
)

2.2 Button #

kotlin
Button(
    onClick = { /* 点击事件 */ },
    modifier = Modifier.padding(16.dp)
) {
    Text("Click Me")
}

2.3 Image #

kotlin
Image(
    painter = painterResource(id = R.drawable.image),
    contentDescription = "Image",
    modifier = Modifier.size(100.dp)
)

2.4 TextField #

kotlin
var text by remember { mutableStateOf("") }

TextField(
    value = text,
    onValueChange = { text = it },
    label = { Text("Enter text") },
    modifier = Modifier.fillMaxWidth()
)

三、布局组件 #

3.1 Column #

kotlin
Column(
    modifier = Modifier.padding(16.dp),
    verticalArrangement = Arrangement.spacedBy(8.dp)
) {
    Text("Item 1")
    Text("Item 2")
    Text("Item 3")
}

3.2 Row #

kotlin
Row(
    modifier = Modifier.padding(16.dp),
    horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
    Text("A")
    Text("B")
    Text("C")
}

3.3 Box #

kotlin
Box(
    modifier = Modifier.size(200.dp)
) {
    Image(
        painter = painterResource(id = R.drawable.background),
        contentDescription = null,
        modifier = Modifier.fillMaxSize()
    )
    Text(
        text = "Overlay",
        modifier = Modifier.align(Alignment.BottomCenter)
    )
}

3.4 LazyColumn #

kotlin
LazyColumn(
    verticalArrangement = Arrangement.spacedBy(8.dp),
    contentPadding = PaddingValues(16.dp)
) {
    items(100) { index ->
        Text("Item $index")
    }
    
    items(users) { user ->
        UserItem(user)
    }
}

四、状态管理 #

4.1 remember #

kotlin
@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    
    Column {
        Text("Count: $count")
        Button(onClick = { count++ }) {
            Text("Increment")
        }
    }
}

4.2 rememberSaveable #

kotlin
@Composable
fun Counter() {
    var count by rememberSaveable { mutableStateOf(0) }
    // 配置更改时保留状态
}

4.3 ViewModel #

kotlin
class MainViewModel : ViewModel() {
    private val _count = MutableStateFlow(0)
    val count: StateFlow<Int> = _count.asStateFlow()
    
    fun increment() {
        _count.value++
    }
}

@Composable
fun MainScreen(viewModel: MainViewModel = viewModel()) {
    val count by viewModel.count.collectAsState()
    
    Column {
        Text("Count: $count")
        Button(onClick = { viewModel.increment() }) {
            Text("Increment")
        }
    }
}

五、Modifier #

5.1 常用Modifier #

kotlin
Text(
    text = "Hello",
    modifier = Modifier
        .padding(16.dp)
        .background(Color.Blue)
        .fillMaxWidth()
        .height(100.dp)
        .clickable { /* 点击事件 */ }
)

5.2 自定义Modifier #

kotlin
fun Modifier.shimmer(): Modifier = composed {
    var size by remember { mutableStateOf(IntSize.Zero) }
    
    background(
        brush = Brush.linearGradient(
            colors = listOf(
                Color.LightGray,
                Color.White,
                Color.LightGray
            )
        )
    )
    .onGloballyPositioned { size = it.size }
}

六、主题 #

6.1 MaterialTheme #

kotlin
@Composable
fun MyApp() {
    MaterialTheme(
        colorScheme = lightColorScheme(
            primary = Color(0xFF6200EE),
            secondary = Color(0xFF03DAC5)
        ),
        typography = Typography(
            bodyLarge = TextStyle(fontSize = 16.sp)
        )
    ) {
        MainScreen()
    }
}

6.2 暗黑模式 #

kotlin
@Composable
fun MyApp() {
    val darkTheme = isSystemInDarkTheme()
    
    MaterialTheme(
        colorScheme = if (darkTheme) darkColorScheme() else lightColorScheme()
    ) {
        MainScreen()
    }
}

七、动画 #

7.1 AnimatedVisibility #

kotlin
var visible by remember { mutableStateOf(true) }

AnimatedVisibility(visible = visible) {
    Text("Hello")
}

Button(onClick = { visible = !visible }) {
    Text("Toggle")
}

7.2 animateContentSize #

kotlin
var expanded by remember { mutableStateOf(false) }

Column(
    modifier = Modifier.animateContentSize()
) {
    Text(
        text = if (expanded) "Long text..." else "Short",
        maxLines = if (expanded) Int.MAX_VALUE else 1
    )
}

7.3 animateAsState #

kotlin
var isSelected by remember { mutableStateOf(false) }

val backgroundColor by animateColorAsState(
    targetValue = if (isSelected) Color.Blue else Color.Gray,
    animationSpec = tween(durationMillis = 300)
)

Box(
    modifier = Modifier
        .background(backgroundColor)
        .clickable { isSelected = !isSelected }
)

八、导航 #

8.1 添加依赖 #

kotlin
implementation("androidx.navigation:navigation-compose:2.7.6")

8.2 导航设置 #

kotlin
@Composable
fun MyApp() {
    val navController = rememberNavController()
    
    NavHost(navController = navController, startDestination = "home") {
        composable("home") {
            HomeScreen(
                onNavigate = { navController.navigate("detail") }
            )
        }
        composable("detail") {
            DetailScreen(
                onBack = { navController.popBackStack() }
            )
        }
    }
}

8.3 传递参数 #

kotlin
NavHost(navController, startDestination = "home") {
    composable(
        "detail/{itemId}",
        arguments = listOf(navArgument("itemId") { type = NavType.StringType })
    ) { backStackEntry ->
        val itemId = backStackEntry.arguments?.getString("itemId")
        DetailScreen(itemId)
    }
}

// 导航
navController.navigate("detail/123")

九、最佳实践 #

9.1 组件拆分 #

kotlin
@Composable
fun UserScreen(user: User) {
    Column {
        UserHeader(user)
        UserContent(user)
        UserFooter(user)
    }
}

@Composable
fun UserHeader(user: User) {
    Row {
        UserAvatar(user.avatar)
        UserName(user.name)
    }
}

9.2 状态提升 #

kotlin
@Composable
fun SearchBar(
    query: String,
    onQueryChange: (String) -> Unit
) {
    TextField(
        value = query,
        onValueChange = onQueryChange
    )
}

@Composable
fun SearchScreen() {
    var query by remember { mutableStateOf("") }
    
    Column {
        SearchBar(query) { query = it }
        SearchResult(query)
    }
}

十、总结 #

本章介绍了Jetpack Compose:

  1. Compose的基本概念
  2. 基础组件
  3. 布局组件
  4. 状态管理
  5. Modifier
  6. 主题配置
  7. 动画效果
  8. 导航
  9. 最佳实践

Jetpack Compose是Android UI的未来,掌握它可以大大提高开发效率。

最后更新:2026-03-26