navigation-compose
종속 항목과 함께 공유 요소를 사용하려면 AnimatedVisibilityScope
를 매개변수로 사용하는 Modifier.sharedElement()
를 사용하세요. 이를 사용하여 표시할 항목과 시기를 결정할 수 있습니다.
다음은 공유 요소와 함께 navigation-compose
를 사용하는 예입니다.
@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 )
공유 요소를 사용한 뒤로 탐색 예측
공유된 요소와 함께 뒤로 탐색 예측을 사용하려면 다음 단계를 따르세요.
이전 섹션의 스니펫을 사용하여 최신
navigation-compose
종속 항목을 사용합니다.dependencies { def nav_version = "2.8.0-beta02" implementation "androidx.navigation:navigation-compose:$nav_version" }
개발자 옵션에서 뒤로 탐색 예측 설정을 사용 설정합니다.
AndroidManifest.xml
파일에android:enableOnBackInvokedCallback="true"
를 추가합니다.<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">