在单Activity的Jetpack Compose应用中如何使用标准安卓页面切换动画?
你提到的动画是新页面从右侧滑入、当前页面向左滑出,返回时则是原页面从左侧滑入、当前页面向右滑出的标准Android页面切换效果。下面是在单Activity架构下,用AnimatedNavHost实现该动画的具体方案:
1. 定义页面切换的动画规则
先创建对应的进入/退出动画,区分普通跳转和返回(pop)的场景:
import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.core.tween import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally // 普通跳转时的动画:新页面从右侧滑入,旧页面向左滑出 val defaultEnterTransition = slideInHorizontally( initialOffsetX = { fullWidth -> fullWidth }, animationSpec = tween(300) ) val defaultExitTransition = slideOutHorizontally( targetOffsetX = { fullWidth -> -fullWidth }, animationSpec = tween(300) ) // 返回(pop)时的动画:原页面从左侧滑入,当前页面向右滑出 val defaultPopEnterTransition = slideInHorizontally( initialOffsetX = { fullWidth -> -fullWidth }, animationSpec = tween(300) ) val defaultPopExitTransition = slideOutHorizontally( targetOffsetX = { fullWidth -> fullWidth }, animationSpec = tween(300) )
2. 在AnimatedNavHost中配置动画
将上面定义的动画传入AnimatedNavHost的对应参数即可:
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.AnimatedNavHost import androidx.navigation.compose.composable // 在你的Compose根组件中 val navController = rememberNavController() AnimatedNavHost( navController = navController, startDestination = "home", enterTransition = { defaultEnterTransition }, exitTransition = { defaultExitTransition }, popEnterTransition = { defaultPopEnterTransition }, popExitTransition = { defaultPopExitTransition } ) { composable("home") { // 首页内容示例 Button(onClick = { navController.navigate("detail") }) { Text("跳转到详情页") } } composable("detail") { // 详情页内容示例 Button(onClick = { navController.popBackStack() }) { Text("返回首页") } } }
3. 自定义调整(可选)
- 若要修改动画速度,直接调整
tween函数的时长参数(比如把300改成250)。 - 若需给特定页面设置单独动画,可在
composable函数内部重写对应transition:
composable( route = "special", enterTransition = { slideInHorizontally(initialOffsetX = { it }, animationSpec = tween(200)) }, exitTransition = { slideOutHorizontally(targetOffsetX = { -it }, animationSpec = tween(200)) } ) { // 特殊页面内容 }
这样就能完全复现你提到的传统Activity切换动画效果,同时符合Jetpack Compose单Activity的最佳实践。
内容的提问来源于stack exchange,提问作者user19095510
相关产品推荐
相关产品推荐

