mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 07:57:03 +05:30
ui: import AnimatedSwipeDismiss code from Brandon McAnsh
Source: https://gist.github.com/bmc08gt/fca95db3bf9fcf255d76f03ec10ea3f9 Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
c8d2de60bb
commit
3201bfe507
3 changed files with 107 additions and 1 deletions
|
@ -29,7 +29,7 @@ android {
|
||||||
|
|
||||||
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
|
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"]
|
freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check", "-Xopt-in=kotlin.RequiresOptIn"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
package dev.msfjarvis.todo.ui
|
||||||
|
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
|
import androidx.compose.animation.EnterTransition
|
||||||
|
import androidx.compose.animation.ExitTransition
|
||||||
|
import androidx.compose.animation.ExperimentalAnimationApi
|
||||||
|
import androidx.compose.animation.core.tween
|
||||||
|
import androidx.compose.animation.expandVertically
|
||||||
|
import androidx.compose.animation.shrinkVertically
|
||||||
|
import androidx.compose.material.DismissDirection
|
||||||
|
import androidx.compose.material.DismissValue
|
||||||
|
import androidx.compose.material.ExperimentalMaterialApi
|
||||||
|
import androidx.compose.material.SwipeToDismiss
|
||||||
|
import androidx.compose.material.rememberDismissState
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.onCommit
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
|
@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterialApi::class)
|
||||||
|
@Composable
|
||||||
|
fun <T> AnimatedSwipeDismiss(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
item: T,
|
||||||
|
background: @Composable (isDismissed: Boolean) -> Unit,
|
||||||
|
content: @Composable (isDismissed: Boolean) -> Unit,
|
||||||
|
directions: Set<DismissDirection> = setOf(DismissDirection.EndToStart),
|
||||||
|
enter: EnterTransition = expandVertically(),
|
||||||
|
exit: ExitTransition = shrinkVertically(
|
||||||
|
animSpec = tween(
|
||||||
|
durationMillis = 500,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
onDismiss: (T) -> Unit
|
||||||
|
) {
|
||||||
|
val dismissState = rememberDismissState()
|
||||||
|
val isDismissed = dismissState.isDismissed(DismissDirection.EndToStart)
|
||||||
|
|
||||||
|
onCommit(dismissState.value) {
|
||||||
|
if (dismissState.value == DismissValue.DismissedToStart) {
|
||||||
|
onDismiss(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimatedVisibility(
|
||||||
|
modifier = modifier,
|
||||||
|
visible = !isDismissed,
|
||||||
|
enter = enter,
|
||||||
|
exit = exit
|
||||||
|
) {
|
||||||
|
SwipeToDismiss(
|
||||||
|
modifier = modifier,
|
||||||
|
state = dismissState,
|
||||||
|
directions = directions,
|
||||||
|
background = { background(isDismissed) },
|
||||||
|
dismissContent = { content(isDismissed) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
48
app/src/main/java/dev/msfjarvis/todo/ui/ListContent.kt
Normal file
48
app/src/main/java/dev/msfjarvis/todo/ui/ListContent.kt
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
package dev.msfjarvis.todo.ui
|
||||||
|
|
||||||
|
import androidx.compose.animation.animate
|
||||||
|
import androidx.compose.foundation.Box
|
||||||
|
import androidx.compose.foundation.ContentGravity
|
||||||
|
import androidx.compose.foundation.Icon
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.lazy.LazyColumnFor
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Delete
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun <T> ListContent(
|
||||||
|
innerPadding: PaddingValues,
|
||||||
|
items: List<T>,
|
||||||
|
onSwipe: (T) -> Unit,
|
||||||
|
onClick: (T) -> Unit,
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
) {
|
||||||
|
LazyColumnFor(
|
||||||
|
modifier = modifier.padding(innerPadding),
|
||||||
|
items = items,
|
||||||
|
) { item ->
|
||||||
|
AnimatedSwipeDismiss(
|
||||||
|
item = item,
|
||||||
|
background = { isDismissed ->
|
||||||
|
Box(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
backgroundColor = Color.Red,
|
||||||
|
paddingStart = 20.dp,
|
||||||
|
paddingEnd = 20.dp,
|
||||||
|
gravity = ContentGravity.CenterEnd
|
||||||
|
) {
|
||||||
|
val alpha = animate(if (isDismissed) 0f else 1f)
|
||||||
|
Icon(Icons.Filled.Delete, tint = Color.White.copy(alpha = alpha))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
content = { /* your item cell (feed your on click here) */ },
|
||||||
|
onDismiss = { onSwipe(it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue