Wenn Sie freigegebene Elemente mit der navigation-compose-Abhängigkeit verwenden möchten, verwenden Sie die Modifier.sharedElement(), die eine AnimatedVisibilityScope als Parameter akzeptiert. So können Sie festlegen, was wann sichtbar sein soll.
Im Folgenden sehen Sie ein Beispiel für die Verwendung von navigation-compose mit freigegebenen Elementen:
@Preview @Composable fun SharedElement_PredictiveBack() { SharedTransitionLayout { val navController = rememberNavController() NavHost( navController = navController, startDestination = "home" ) { composable("home") { HomeScreen( this@SharedTransitionLayout, this@composable, { navController.navigate("details/$it") } ) } composable( "details/{item}", arguments = listOf(navArgument("item") { type = NavType.IntType }) ) { backStackEntry -> val id = backStackEntry.arguments?.getInt("item") val snack = listSnacks[id!!] DetailsScreen( id, snack, this@SharedTransitionLayout, this@composable, { navController.navigate("home") } ) } } } } @Composable fun DetailsScreen( id: Int, snack: Snack, sharedTransitionScope: SharedTransitionScope, animatedContentScope: AnimatedContentScope, onBackPressed: () -> Unit ) { with(sharedTransitionScope) { Column( Modifier .fillMaxSize() .clickable { onBackPressed() } ) { Image( painterResource(id = snack.image), contentDescription = snack.description, contentScale = ContentScale.Crop, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$id"), animatedVisibilityScope = animatedContentScope ) .aspectRatio(1f) .fillMaxWidth() ) Text( snack.name, fontSize = 18.sp, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "text-$id"), animatedVisibilityScope = animatedContentScope ) .fillMaxWidth() ) } } } @Composable fun HomeScreen( sharedTransitionScope: SharedTransitionScope, animatedContentScope: AnimatedContentScope, onItemClick: (Int) -> Unit, ) { LazyColumn( modifier = Modifier .fillMaxSize() .padding(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { itemsIndexed(listSnacks) { index, item -> Row( Modifier.clickable { onItemClick(index) } ) { Spacer(modifier = Modifier.width(8.dp)) with(sharedTransitionScope) { Image( painterResource(id = item.image), contentDescription = item.description, contentScale = ContentScale.Crop, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$index"), animatedVisibilityScope = animatedContentScope ) .size(100.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text( item.name, fontSize = 18.sp, modifier = Modifier .align(Alignment.CenterVertically) .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "text-$index"), animatedVisibilityScope = animatedContentScope, ) ) } } } } } data class Snack( val name: String, val description: String, @DrawableRes val image: Int )
Intelligente „Zurück“-Geste mit gemeinsamen Elementen
So verwenden Sie Predictive Back mit freigegebenen Elementen:
Verwenden Sie die aktuelle
navigation-compose-Abhängigkeit mit dem Snippet aus dem vorherigen Abschnitt.dependencies { def nav_version = "2.8.0-beta02" implementation "androidx.navigation:navigation-compose:$nav_version" }Aktivieren Sie in den Entwickleroptionen die Einstellung für die vorhersagende Zurück-Geste.
Fügen Sie
android:enableOnBackInvokedCallback="true"zu Ihrer DateiAndroidManifest.xmlhinzu:<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:enableOnBackInvokedCallback="true" android:theme="@style/Theme.Snippets">