NavDisplay
предоставляет встроенные возможности анимации для создания плавных визуальных переходов при навигации пользователей по вашему приложению. Вы можете настроить эти анимации глобально для NavDisplay
или для каждого NavEntry
с помощью метаданных.
Переопределить переходы по умолчанию
NavDisplay
использует ContentTransform
s для определения того, как контент анимируется во время навигации. Вы можете переопределить поведение анимации по умолчанию, предоставив параметры перехода в NavDisplay
.
-
transitionSpec
: этот параметр определяетContentTransform
, применяемый при добавлении контента в стек переходов назад (т. е. при переходе вперед). -
popTransitionSpec
: этот параметр определяетContentTransform
, применяемый при удалении контента из стека переходов (т. е. при переходе назад). -
predictivePopTransitionSpec
: этот параметр определяетContentTransform
, применяемый при извлечении контента с помощью предиктивного жеста «назад».
Переопределять переходы на индивидуальном уровне NavEntry
Вы также можете определить пользовательские анимации для определенных NavEntry
s, используя их метаданные. NavDisplay
распознает специальные ключи метаданных для применения переходов для каждой записи:
-
NavDisplay.transitionSpec
: используйте эту вспомогательную функцию для определения анимации прямой навигации. -
NavDisplay.popTransitionSpec
: используйте эту вспомогательную функцию для определения анимации обратной навигации для определенногоNavEntry
. -
NavDisplay.predictivePopTransitionSpec
: используйте эту вспомогательную функцию, чтобы определить анимацию для предиктивных жестов «назад» для определенногоNavEntry
.
Эти переходы метаданных для каждой записи переопределяют глобальные переходы NavDisplay
с тем же именем.
В следующем фрагменте показаны как глобальные переходы NavDisplay
, так и переопределение на индивидуальном уровне NavEntry
:
@Serializable data object ScreenA : NavKey @Serializable data object ScreenB : NavKey @Serializable data object ScreenC : NavKey class AnimatedNavDisplayActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Scaffold { paddingValues -> val backStack = rememberNavBackStack(ScreenA) NavDisplay( backStack = backStack, onBack = { backStack.removeLastOrNull() }, entryProvider = entryProvider { entry<ScreenA> { ContentOrange("This is Screen A") { Button(onClick = { backStack.add(ScreenB) }) { Text("Go to Screen B") } } } entry<ScreenB> { ContentMauve("This is Screen B") { Button(onClick = { backStack.add(ScreenC) }) { Text("Go to Screen C") } } } entry<ScreenC>( metadata = NavDisplay.transitionSpec { // Slide new content up, keeping the old content in place underneath slideInVertically( initialOffsetY = { it }, animationSpec = tween(1000) ) togetherWith ExitTransition.KeepUntilTransitionsFinished } + NavDisplay.popTransitionSpec { // Slide old content down, revealing the new content in place underneath EnterTransition.None togetherWith slideOutVertically( targetOffsetY = { it }, animationSpec = tween(1000) ) } + NavDisplay.predictivePopTransitionSpec { // Slide old content down, revealing the new content in place underneath EnterTransition.None togetherWith slideOutVertically( targetOffsetY = { it }, animationSpec = tween(1000) ) } ) { ContentGreen("This is Screen C") } }, transitionSpec = { // Slide in from right when navigating forward slideInHorizontally(initialOffsetX = { it }) togetherWith slideOutHorizontally(targetOffsetX = { -it }) }, popTransitionSpec = { // Slide in from left when navigating back slideInHorizontally(initialOffsetX = { -it }) togetherWith slideOutHorizontally(targetOffsetX = { it }) }, predictivePopTransitionSpec = { // Slide in from left when navigating back slideInHorizontally(initialOffsetX = { -it }) togetherWith slideOutHorizontally(targetOffsetX = { it }) }, modifier = Modifier.padding(paddingValues) ) } } } }