SwipeToRevealNoPartialRevealWithScalingLazyColumnSample
@Preview
@Composable
fun SwipeToRevealNoPartialRevealWithScalingLazyColumnSample() {
val slcState = rememberScalingLazyListState()
val messages = remember {
mutableStateListOf<String>().apply {
for (i in 1..100) {
add("Message #${i}")
}
}
}
ScalingLazyColumn(
state = slcState,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 20.dp),
modifier = Modifier.background(Color.Black),
) {
items(items = messages, key = { it }) { message ->
SwipeToReveal(
hasPartiallyRevealedState = false,
primaryAction = {
PrimaryActionButton(
onClick = { messages.remove(message) },
icon = { Icon(Icons.Outlined.Delete, contentDescription = "Delete") },
text = { Text("Delete") },
)
},
onSwipePrimaryAction = { messages.remove(message) },
) {
Button(
modifier =
Modifier.fillMaxWidth().semantics {
// Use custom actions to make the primary action accessible
customActions =
listOf(
CustomAccessibilityAction("Delete") {
messages.remove(message)
true
}
)
},
onClick = {},
) {
Text(message, modifier = Modifier.fillMaxSize())
}
}
}
}
}
SwipeToRevealSample
@Composable
fun SwipeToRevealSample() {
SwipeToReveal(
primaryAction = {
PrimaryActionButton(
onClick = { /* This block is called when the primary action is executed. */ },
icon = { Icon(Icons.Outlined.Delete, contentDescription = "Delete") },
text = { Text("Delete") },
)
},
onSwipePrimaryAction = { /* This block is called when the full swipe gesture is performed. */
},
secondaryAction = {
SecondaryActionButton(
onClick = { /* This block is called when the secondary action is executed. */ },
icon = { Icon(Icons.Outlined.MoreVert, contentDescription = "Options") },
)
},
undoPrimaryAction = {
UndoActionButton(
onClick = { /* This block is called when the undo primary action is executed. */ },
text = { Text("Undo Delete") },
)
},
) {
Button(
modifier =
Modifier.fillMaxWidth().semantics {
// Use custom actions to make the primary and secondary actions accessible
customActions =
listOf(
CustomAccessibilityAction("Delete") {
/* Add the primary action click handler here */
true
},
CustomAccessibilityAction("Options") {
/* Add the secondary click handler here */
true
},
)
},
onClick = {},
) {
Text("This Button has two actions", modifier = Modifier.fillMaxSize())
}
}
}
SwipeToRevealSingleActionCardSample
@Composable
fun SwipeToRevealSingleActionCardSample() {
SwipeToReveal(
primaryAction = {
PrimaryActionButton(
onClick = { /* This block is called when the primary action is executed. */ },
icon = { Icon(Icons.Outlined.Delete, contentDescription = "Delete") },
text = { Text("Delete") },
modifier = Modifier.height(SwipeToRevealDefaults.LargeActionButtonHeight),
)
},
onSwipePrimaryAction = { /* This block is called when the full swipe gesture is performed. */
},
undoPrimaryAction = {
UndoActionButton(
onClick = { /* This block is called when the undo primary action is executed. */ },
text = { Text("Undo Delete") },
)
},
) {
Card(
modifier =
Modifier.fillMaxWidth().semantics {
// Use custom actions to make the primary action accessible
customActions =
listOf(
CustomAccessibilityAction("Delete") {
/* Add the primary action click handler here */
true
}
)
},
onClick = {},
) {
Text(
"This Card has one action, and the revealed button is taller",
modifier = Modifier.fillMaxSize(),
)
}
}
}
SwipeToRevealWithScalingLazyColumnSample
@Preview
@Composable
fun SwipeToRevealWithScalingLazyColumnSample() {
val slcState = rememberScalingLazyListState()
val coroutineScope = rememberCoroutineScope()
val messages = remember {
mutableStateListOf<String>().apply {
for (i in 1..100) {
add("This Button $i has two actions")
}
}
}
ScalingLazyColumn(
state = slcState,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 20.dp),
modifier = Modifier.background(Color.Black),
) {
items(items = messages, key = { it }) { message ->
val revealState = rememberRevealState()
// SwipeToReveal should be reset to covered when scrolling occurs.
LaunchedEffect(slcState.isScrollInProgress) {
if (
slcState.isScrollInProgress && revealState.currentValue != RevealValue.Covered
) {
coroutineScope.launch {
revealState.animateTo(targetValue = RevealValue.Covered)
}
}
}
SwipeToReveal(
revealState = revealState,
primaryAction = {
PrimaryActionButton(
onClick = { messages.remove(message) },
icon = { Icon(Icons.Outlined.Delete, contentDescription = "Delete") },
text = { Text("Delete") },
)
},
onSwipePrimaryAction = { messages.remove(message) },
secondaryAction = {
SecondaryActionButton(
onClick = { /* This block is called when the secondary action is executed. */
},
icon = { Icon(Icons.Outlined.MoreVert, contentDescription = "Options") },
)
},
) {
Button(
modifier =
Modifier.fillMaxWidth().semantics {
// Use custom actions to make the primary and secondary actions
// accessible
customActions =
listOf(
CustomAccessibilityAction("Delete") {
messages.remove(message)
true
},
CustomAccessibilityAction("Options") {
/* Add the secondary click handler here */
true
},
)
},
onClick = {},
) {
Text(message, modifier = Modifier.fillMaxSize())
}
}
}
}
}
@Preview
@Composable
fun SwipeToRevealWithTransformingLazyColumnSample() {
val transformationSpec = rememberTransformationSpec()
val tlcState = rememberTransformingLazyColumnState()
val coroutineScope = rememberCoroutineScope()
val messages = remember {
mutableStateListOf<String>().apply {
for (i in 1..100) {
add("Message #${i}")
}
}
}
TransformingLazyColumn(
state = tlcState,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 20.dp),
modifier = Modifier.background(Color.Black),
) {
items(items = messages, key = { it }) { message ->
val revealState = rememberRevealState()
// SwipeToReveal should be reset to covered when scrolling occurs.
LaunchedEffect(tlcState.isScrollInProgress) {
if (
tlcState.isScrollInProgress && revealState.currentValue != RevealValue.Covered
) {
coroutineScope.launch {
revealState.animateTo(targetValue = RevealValue.Covered)
}
}
}
SwipeToReveal(
primaryAction = {
PrimaryActionButton(
onClick = { messages.remove(message) },
icon = { Icon(Icons.Outlined.Delete, contentDescription = "Delete") },
text = { Text("Delete") },
modifier = Modifier.height(SwipeToRevealDefaults.LargeActionButtonHeight),
)
},
revealState = revealState,
onSwipePrimaryAction = { messages.remove(message) },
modifier =
Modifier.transformedHeight(this@items, transformationSpec)
.animateItem()
.graphicsLayer {
with(transformationSpec) {
applyContainerTransformation(scrollProgress)
}
// Is needed to disable clipping.
compositingStrategy = CompositingStrategy.ModulateAlpha
clip = false
},
) {
TitleCard(
onClick = {},
title = { Text(message) },
subtitle = { Text("Subtitle") },
modifier =
Modifier.semantics {
// Use custom actions to make the primary action accessible
customActions =
listOf(
CustomAccessibilityAction("Delete") {
messages.remove(message)
true
}
)
},
) {
Text("Message body which extends over multiple lines to extend the card")
}
}
}
}
}