代码之家  ›  专栏  ›  技术社区  ›  Rofie Sagara

通过Nav Augments在android组合导航中输入Transition参数

  •  0
  • Rofie Sagara  · 技术社区  · 8 月前

    我有一个导航组合,它将参数传递给开始动画,特别是 scaleIn scaleOut 物业。然而 offSetX offSetY 值为null。

    但问题是:当我从以下位置访问这些值时 it.arguments ,它们显示了正确的值。你能帮我理解为什么会发生这种情况吗?

    composable(
        route = NavigationRoute.PreviewImage.route,
        deepLinks = listOf(navDeepLink { uriPattern = "suntuk://preview/{id}/{type}/{x}/{y}" }),
        arguments = listOf(
            navArgument("id") { type = NavType.StringType },
            navArgument("type") { type = NavType.IntType },
            navArgument("x") { type = NavType.FloatType },
            navArgument("y") { type = NavType.FloatType }
        ),
        enterTransition = {
            val offsetX = initialState.arguments?.getFloat("x") ?: 0f
            val offsetY = initialState.arguments?.getFloat("y") ?: 0f
            scaleIn(
                animationSpec = tween(durationMillis = 5000),
                transformOrigin = TransformOrigin(
                    offsetX,
                    offsetY
                )
            )
        },
        exitTransition = {
            val offsetX = initialState.arguments?.getFloat("x") ?: 0f
            val offsetY = initialState.arguments?.getFloat("y") ?: 0f
            Timber.i("Offset: $offsetX, $offsetY")
            scaleOut(
                animationSpec = tween(durationMillis = 5000),
                transformOrigin = TransformOrigin(
                    offsetX,
                    offsetY
                )
            )
        }
    ) {
        val id = it.arguments?.getString("id") ?: ""
        val type = it.arguments?.getInt("type") ?: 0
        val x = it.arguments?.getFloat("x") ?: 0f
        val y = it.arguments?.getFloat("y") ?: 0f
        Timber.i("Preview image: $id, $type, $x, $y")
        val viewModel: PreviewImageViewModel = koinViewModel { parameterSetOf(id, type) }
    
        PreviewImageScreen(
            viewModel = viewModel,
            onBack = {
                navController.navigateUp()
            }
        )
    }
    
    1 回复  |  直到 8 月前
        1
  •  0
  •   ianhanniballake    8 月前

    这个 enterTransition 从a initialState -您在前往该目的地之前所处的屏幕 targetState -过渡结束时,您将看到的屏幕。这意味着你应该从 目标状态 如果你想让它成为你的实例 NavigationRoute.PreviewImage.route :

    enterTransition = {
        val offsetX = targetState.arguments?.getFloat("x") ?: 0f
        val offsetY = targetState.arguments?.getFloat("y") ?: 0f
    

    但是,如果你试图为上一个屏幕中的元素设置动画的关键帧,你实际上想要使用的是 shared element APIs 其中,上一屏幕上列表中的元素与前一屏幕上的元素相同 key 作为另一个屏幕中的整个屏幕,从而使过渡从所选的列表项中动画化。