80 lines
2.9 KiB
Kotlin
80 lines
2.9 KiB
Kotlin
package com.pushdeer.os.ui.compose.componment
|
|
|
|
import androidx.compose.animation.animateColorAsState
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.material.*
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.filled.Delete
|
|
import androidx.compose.material.icons.filled.Done
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.clip
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.unit.dp
|
|
import com.pushdeer.os.values.ConstValues
|
|
|
|
@ExperimentalMaterialApi
|
|
@Composable
|
|
fun SwipeToDismissItem(
|
|
onDismiss: () -> Unit,
|
|
sidePadding: Boolean = false,
|
|
content: @Composable RowScope.() -> Unit
|
|
) {
|
|
val dismissState = rememberDismissState()
|
|
if (dismissState.isDismissed(DismissDirection.EndToStart)) {
|
|
onDismiss()
|
|
}
|
|
Column(modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(bottom = 16.dp)) {
|
|
SwipeToDismiss(
|
|
state = dismissState,
|
|
background = {
|
|
val direction = dismissState.dismissDirection ?: return@SwipeToDismiss
|
|
|
|
val color by animateColorAsState(
|
|
when (dismissState.targetValue) {
|
|
DismissValue.DismissedToEnd -> Color.Green
|
|
DismissValue.DismissedToStart -> Color.Red
|
|
else -> Color.Gray
|
|
}
|
|
)
|
|
|
|
val alignment = when (direction) {
|
|
DismissDirection.StartToEnd -> Alignment.CenterStart
|
|
DismissDirection.EndToStart -> Alignment.CenterEnd
|
|
}
|
|
|
|
val icon = when (direction) {
|
|
DismissDirection.StartToEnd -> Icons.Default.Done
|
|
DismissDirection.EndToStart -> Icons.Default.Delete
|
|
}
|
|
|
|
Box(
|
|
contentAlignment = alignment,
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.clip(RoundedCornerShape(4.dp))
|
|
.background(color)
|
|
.padding(end = 32.dp)
|
|
) {
|
|
Icon(
|
|
imageVector = icon,
|
|
contentDescription = "",
|
|
// tint = Color.Red
|
|
)
|
|
}
|
|
},
|
|
directions = setOf(DismissDirection.EndToStart, DismissDirection.EndToStart),
|
|
dismissThresholds = { direction ->
|
|
FractionalThreshold(if (direction == DismissDirection.EndToStart) 0.45f else 0.57f)
|
|
},
|
|
dismissContent = content,
|
|
modifier = Modifier.padding(horizontal = if (sidePadding) ConstValues.MainPageSidePadding else 0.dp)
|
|
)
|
|
}
|
|
} |