O NavDisplay
oferece recursos de animação integrados para criar transições visuais
suaves enquanto os usuários navegam pelo app. É possível personalizar essas
animações globalmente para o NavDisplay
ou por NavEntry
usando
metadados.
Substituir transições padrão
O NavDisplay
usa ContentTransform
s para definir como o conteúdo é animado durante a
navegação. É possível substituir os comportamentos de animação padrão fornecendo
parâmetros de transição para NavDisplay
.
transitionSpec
: esse parâmetro define aContentTransform
a ser aplicada quando o conteúdo é adicionado à backstack (ou seja, ao navegar para frente).popTransitionSpec
: esse parâmetro define aContentTransform
a ser aplicada quando o conteúdo é removido da backstack, ou seja, quando você volta para a página anterior.predictivePopTransitionSpec
: esse parâmetro define oContentTransform
a ser aplicado quando o conteúdo é aberto usando um gesto de volta previsor.
Substituir transições no nível individual de NavEntry
Também é possível definir animações personalizadas para NavEntry
s específicos usando os
metadados deles. O NavDisplay
reconhece chaves de metadados especiais para aplicar transições
por entrada:
NavDisplay.transitionSpec
: use essa função auxiliar para definir a animação de navegação para frente.NavDisplay.popTransitionSpec
: use essa função auxiliar para definir a animação de navegação para trás de umNavEntry
específico.NavDisplay.predictivePopTransitionSpec
: use essa função auxiliar para definir a animação de gestos de volta preditiva para umNavEntry
específico.
Essas transições de metadados por entrada substituem as transições globais de NavDisplay
com o mesmo nome.
O snippet a seguir demonstra transições globais de NavDisplay
e uma
substituição no nível individual de 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) ) } } } }