要在Android Compose中忽略SwipeToDismiss中的用户交互,可以使用Modifier.ignorePointer()修饰符来禁用触摸事件。下面是一个示例:
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.scrollable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@Composable
fun SwipeToDismissScreen() {
val items = remember { mutableStateListOf("Item 1", "Item 2", "Item 3", "Item 4") }
Scaffold {
Box(modifier = Modifier.fillMaxSize()) {
SwipeToDismiss(
items = items,
onDismiss = { index ->
items.removeAt(index)
}
) { item ->
Text(text = item)
}
}
}
}
@Composable
fun SwipeToDismiss(
items: List,
onDismiss: (Int) -> Unit,
swipeThreshold: Dp = 80.dp,
content: @Composable (String) -> Unit
) {
val swipeableState = rememberSwipeableState(0)
val density = LocalDensity.current
items.forEachIndexed { index, item ->
Box(
Modifier
.fillMaxWidth()
.offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
.swipeable(
state = swipeableState,
anchors = mapOf(0f to 0, -density.toPx(swipeThreshold) to -1),
thresholds = { _, _ -> FractionalThreshold(0.3f) },
orientation = Orientation.Horizontal
)
.ignorePointer(swipeableState.isRunning)
) {
content(item)
}
if (swipeableState.currentValue == -1) {
onDismiss(index)
}
}
}
在这个示例中,我们使用了SwipeToDismissScreen和SwipeToDismiss两个组件。SwipeToDismissScreen是一个包含Scaffold和一个Box的组件,用作内容的容器。SwipeToDismiss是一个自定义的组件,它接收一个items列表和一个onDismiss回调函数,用于处理滑动删除时的逻辑。
在SwipeToDismiss中,我们使用rememberSwipeableState来跟踪滑动的状态。然后,我们遍历items列表,并为每个item创建一个Box组件。我们使用Modifier.swipeable修饰符来使Box可滑动,并使用Modifier.ignorePointer(swipeableState.isRunning)来禁用触摸事件。这样,当滑动动画正在运行时,用户将无法与该项进行交互。
如果滑动操作的阈值达到或超过指定的swipeThreshold值,我们调用onDismiss回调函数,并将相应的项从items列表中移除。