You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在单Activity的Jetpack Compose应用中如何使用标准安卓页面切换动画?

在Jetpack Compose的AnimatedNavHost中实现标准页面切换动画

你提到的动画是新页面从右侧滑入、当前页面向左滑出,返回时则是原页面从左侧滑入、当前页面向右滑出的标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:12:40