Skip to content

Commit 0dcfc0b

Browse files
authored
Compose 1.10: Add snippet to create dynamic shared elements (#711)
* Add snippet to create dynamic shared elements * Change comments to Config that depends on state changing
1 parent c8dc568 commit 0dcfc0b

File tree

1 file changed

+82
-9
lines changed

1 file changed

+82
-9
lines changed

compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/CustomizeSharedElementsSnippets.kt

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,19 @@ import androidx.compose.animation.core.SeekableTransitionState
3535
import androidx.compose.animation.core.keyframes
3636
import androidx.compose.animation.core.rememberTransition
3737
import androidx.compose.animation.core.tween
38+
import androidx.compose.animation.core.updateTransition
3839
import androidx.compose.animation.fadeIn
3940
import androidx.compose.animation.fadeOut
4041
import androidx.compose.animation.slideInVertically
4142
import androidx.compose.animation.slideOutVertically
43+
import androidx.compose.animation.togetherWith
4244
import androidx.compose.foundation.Image
4345
import androidx.compose.foundation.background
4446
import androidx.compose.foundation.border
4547
import androidx.compose.foundation.clickable
4648
import androidx.compose.foundation.horizontalScroll
4749
import androidx.compose.foundation.interaction.MutableInteractionSource
50+
import androidx.compose.foundation.layout.Arrangement
4851
import androidx.compose.foundation.layout.Box
4952
import androidx.compose.foundation.layout.Column
5053
import androidx.compose.foundation.layout.Row
@@ -62,13 +65,15 @@ import androidx.compose.material.icons.Icons
6265
import androidx.compose.material.icons.outlined.Create
6366
import androidx.compose.material.icons.outlined.Favorite
6467
import androidx.compose.material.icons.outlined.Share
68+
import androidx.compose.material3.Checkbox
6569
import androidx.compose.material3.Icon
6670
import androidx.compose.material3.Slider
6771
import androidx.compose.material3.Surface
6872
import androidx.compose.material3.Text
6973
import androidx.compose.runtime.Composable
7074
import androidx.compose.runtime.getValue
7175
import androidx.compose.runtime.mutableIntStateOf
76+
import androidx.compose.runtime.mutableStateListOf
7277
import androidx.compose.runtime.mutableStateOf
7378
import androidx.compose.runtime.remember
7479
import androidx.compose.runtime.rememberCoroutineScope
@@ -83,6 +88,7 @@ import androidx.compose.ui.res.painterResource
8388
import androidx.compose.ui.tooling.preview.Preview
8489
import androidx.compose.ui.unit.dp
8590
import androidx.compose.ui.unit.sp
91+
import androidx.glance.currentState
8692
import androidx.navigation.NavType
8793
import androidx.navigation.compose.NavHost
8894
import androidx.navigation.compose.composable
@@ -272,10 +278,10 @@ private fun DetailsContent(
272278
// [END android_compose_shared_element_text_bounds_transform]
273279
Text(
274280
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet lobortis velit. " +
275-
"Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
276-
" Curabitur sagittis, lectus posuere imperdiet facilisis, nibh massa " +
277-
"molestie est, quis dapibus orci ligula non magna. Pellentesque rhoncus " +
278-
"hendrerit massa quis ultricies. Curabitur congue ullamcorper leo, at maximus",
281+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
282+
" Curabitur sagittis, lectus posuere imperdiet facilisis, nibh massa " +
283+
"molestie est, quis dapibus orci ligula non magna. Pellentesque rhoncus " +
284+
"hendrerit massa quis ultricies. Curabitur congue ullamcorper leo, at maximus",
279285
modifier = Modifier.skipToLookaheadSize()
280286
)
281287
}
@@ -332,7 +338,7 @@ private fun SharedElement_Clipping() {
332338
rememberSharedContentState(key = "title"),
333339
animatedVisibilityScope = this@AnimatedContent,
334340

335-
)
341+
)
336342
)
337343
}
338344
} else {
@@ -370,10 +376,10 @@ private fun SharedElement_Clipping() {
370376
)
371377
Text(
372378
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet lobortis velit. " +
373-
"Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
374-
" Curabitur sagittis, lectus posuere imperdiet facilisis, nibh massa " +
375-
"molestie est, quis dapibus orci ligula non magna. Pellentesque rhoncus " +
376-
"hendrerit massa quis ultricies. Curabitur congue ullamcorper leo, at maximus"
379+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
380+
" Curabitur sagittis, lectus posuere imperdiet facilisis, nibh massa " +
381+
"molestie est, quis dapibus orci ligula non magna. Pellentesque rhoncus " +
382+
"hendrerit massa quis ultricies. Curabitur congue ullamcorper leo, at maximus"
377383
)
378384
}
379385
}
@@ -730,3 +736,70 @@ fun CustomPredictiveBackHandle() {
730736

731737
// [END android_compose_shared_element_custom_seeking]
732738
}
739+
740+
@Composable
741+
@Preview
742+
fun DynamicSharedElements() {
743+
var currentState by remember {
744+
mutableStateOf("A")
745+
}
746+
// [START android_compose_shared_element_dynamic_enable_disable]
747+
SharedTransitionLayout {
748+
val transition = updateTransition(currentState)
749+
transition.AnimatedContent { targetState ->
750+
// Create the configuration that depends on state changing.
751+
fun animationConfig() : SharedTransitionScope.SharedContentConfig {
752+
return object : SharedTransitionScope.SharedContentConfig {
753+
override val SharedTransitionScope.SharedContentState.isEnabled: Boolean
754+
// For this example, we only enable the transition in one direction
755+
// from A -> B and not the other way around.
756+
get() =
757+
transition.currentState == "A" && transition.targetState == "B"
758+
}
759+
}
760+
when (targetState) {
761+
"A" -> Box(
762+
modifier = Modifier
763+
.sharedElement(
764+
rememberSharedContentState(
765+
key = "shared_box",
766+
config = animationConfig()
767+
),
768+
animatedVisibilityScope = this
769+
)
770+
// [START_EXCLUDE]
771+
.size(100.dp)
772+
.background(Color.Red)
773+
.clickable {
774+
currentState = "B"
775+
}
776+
// [END_EXCLUDE]
777+
) {
778+
// Your content
779+
}
780+
"B" -> {
781+
Box(
782+
modifier = Modifier
783+
.sharedElement(
784+
rememberSharedContentState(
785+
key = "shared_box",
786+
config = animationConfig()
787+
),
788+
animatedVisibilityScope = this
789+
)
790+
// [START_EXCLUDE]
791+
.size(200.dp)
792+
.background(Color.Blue)
793+
.clickable {
794+
currentState = "A"
795+
}
796+
// [END_EXCLUDE]
797+
) {
798+
// Your content
799+
}
800+
}
801+
}
802+
}
803+
}
804+
// [END android_compose_shared_element_dynamic_enable_disable]
805+
}

0 commit comments

Comments
 (0)