前言
侧滑删除可以说是开发中常见的功能之一,话不多说直接看效果图。
思路
通过Box堆叠并加上拖动手势实现,伪代码如下:
Kotlin
Box {
Box()
Box(
modifier = Modifier
.graphicsLayer {
translationX = anchoredDraggableState.offset
}
)
}
拖动手势实现
AnchoredDraggable是compose提供的锚定状态的可拖动组件,我们可以通过它来实现拖动。
Kotlin
val minBound = 0f //描点的位置
val maxBound = 100f //描点的位置
val anchoredDraggableState = remember(maxBound) {
AnchoredDraggableState(
initialValue = checked,
animationSpec = TweenSpec(durationMillis = 1000),
anchors = DraggableAnchors {
false at minBound
true at maxBound
},
positionalThreshold = { distance -> distance * 0.5f }, //触发位置的阈值,这里设置0.5即中间位置时切换到下一个状态
velocityThreshold = { maxBound } //拖动速度必须超过该阈值才能设置到下一个状态
)
}
完整代码
Kotlin
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun SwipeBox(
checked: Boolean,
onCheckedChange: ((Boolean) -> Unit)?,
modifier: Modifier = Modifier,
bottomContent: @Composable BoxScope.() -> Unit,
content: @Composable BoxScope.() -> Unit
) {
var bottomWidth by remember { mutableFloatStateOf(0f) }
var bottomHeight by remember { mutableStateOf(0) }
val minBound = 0f
val maxBound = -bottomWidth
var forceAnimationCheck by remember { mutableStateOf(false) }
val anchoredDraggableState = remember(maxBound) {
AnchoredDraggableState(
initialValue = checked,
animationSpec = TweenSpec(durationMillis = 1000),
anchors = DraggableAnchors {
false at minBound
true at maxBound
},
positionalThreshold = { distance -> distance * 0.5f },
velocityThreshold = { maxBound }
)
}
val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)
val currentChecked by rememberUpdatedState(checked)
LaunchedEffect(anchoredDraggableState) {
snapshotFlow { anchoredDraggableState.currentValue }
.collectLatest { newValue ->
if (currentChecked != newValue) {
currentOnCheckedChange?.invoke(newValue)
forceAnimationCheck = !forceAnimationCheck
}
}
}
LaunchedEffect(checked, forceAnimationCheck) {
if (checked != anchoredDraggableState.currentValue) {
anchoredDraggableState.animateTo(checked)
}
}
Box(
modifier = modifier
.anchoredDraggable(
state = anchoredDraggableState,
orientation = Orientation.Horizontal,
enabled = onCheckedChange != null
)
.clipToBounds()
) {
Box(
modifier = Modifier
.align(Alignment.CenterEnd)
.height(with(LocalDensity.current) {
bottomHeight.toDp()
})
.onSizeChanged {
bottomWidth = it.width.toFloat()
}
) {
bottomContent()
}
Box(
modifier = Modifier
.graphicsLayer {
translationX = anchoredDraggableState.offset
}
.onSizeChanged {
bottomHeight = it.height
}
) {
content()
}
}
}
如何使用
Kotlin
var checked by remember { mutableStateOf(false) }
SwipeBox(
checked = checked,
onCheckedChange = { checked = it },
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight(),
bottomContent = {
Row {
Box(
modifier = Modifier
.width(70.dp)
.fillMaxHeight()
.background(colorResource(R.color.blue))
) {
Text(
text = "标为未读",
modifier = Modifier.align(Alignment.Center),
style = TextStyle.Default.copy(
color = colorResource(R.color.white),
fontSize = 12.sp
)
)
}
Box(
modifier = Modifier
.width(70.dp)
.fillMaxHeight()
.background(colorResource(R.color.yellow))
) {
Text(
text = "不显示",
modifier = Modifier.align(Alignment.Center),
style = TextStyle.Default.copy(
color = colorResource(R.color.white),
fontSize = 12.sp
)
)
}
Box(
modifier = Modifier
.width(70.dp)
.fillMaxHeight()
.background(colorResource(R.color.red))
) {
Text(
text = "删除",
modifier = Modifier.align(Alignment.Center),
style = TextStyle.Default.copy(
color = colorResource(R.color.white),
fontSize = 12.sp
)
)
}
}
}
) {
Column(
modifier = Modifier
.fillMaxWidth()
.background(colorResource(R.color.white))
.padding(20.dp, 10.dp)
) {
Text(
text = "小美",
color = colorResource(R.color.text_333),
fontSize = 14.sp
)
Spacer(Modifier.size(5.dp))
Text(
text = "我的电脑坏了,你能过来看看嘛。",
color = colorResource(R.color.text_666),
fontSize = 12.sp
)
}
}
Thanks
以上就是本篇文章的全部内容,如有问题欢迎指出,我们一起进步。
如果觉得本篇文章对您有帮助的话请点个赞让更多人看到吧,您的鼓励是我前进的动力。
谢谢~~
源代码地址
推荐阅读
- Jetpack Compose : 从改造你的登录页面开始 - 掘金 (juejin.cn)
- Jetpack Compose : 一学就会的自定义下拉刷新&加载更多 - 掘金 (juejin.cn)
- Jetpack Compose : 优雅的使用WebView - 掘金 (juejin.cn)
- Jetpack Compose : 一文学会嵌套滚动NestedScrollConnection - 掘金 (juejin.cn)
- Jetpack Compose : 超简单实现滚轮控件(WheelPicker) - 掘金 (juejin.cn)
- Jetpack Compose : 超简单实现文本展开和收起 - 掘金 (juejin.cn)