作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在撰写时遇到问题。我尝试实现简单的日历。我已经显示了月份,并启用了通过箭头更改月份。
现在我想通过滑动添加更改月份。
我试过 .swipeable
这是示例:
val size = remember { mutableStateOf(Size.Zero) }
val swipeableState = rememberSwipeableState(0)
val width = if (size.value.width == 0f) 1f else size.value.width - 60.dp.value * 2
Box(
modifier = Modifier
.fillMaxWidth()
.onSizeChanged { size.value = Size(it.width.toFloat(), it.height.toFloat()) }
.swipeable(
state = swipeableState,
anchors = mapOf(0f to 0, width to 1),
thresholds = { _, _ -> FractionalThreshold(0.3f) },
orientation = Orientation.Horizontal
)
.background(Color.LightGray)
) {
Box(
Modifier
.offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
.size(60.dp)
.background(Color.DarkGray)
)
}
但这并不完美。我需要在日历区域之外举行,我不知道如何更改月份的状态(响应显示日历)。
最佳答案
您可以使用 Side Effects 观察任何状态.如果您需要等待操作完成,可以使用 if
+ DisposableEffect
:
if (swipeableState.isAnimationRunning) {
DisposableEffect(Unit) {
onDispose {
println("animation finished")
}
}
}
当动画开始时,我创建了一个
DisposableEffect
当它结束时,
onDispose
被调用,表示动画结束。
onSizeChanged
之后更改 anchor 时,这也开始了动画。但是你可以检查值是否已经改变,所以这不是什么大问题。
val width = if (size.value.width == 0f) 1f else size.value.width - 60.dp.value * 2
rememeber
与 size.value.width
作为关键,因为 width
仅当该值更改时才需要重新计算。 enum class SwipeDirection(val raw: Int) {
Left(0),
Initial(1),
Right(2),
}
@Composable
fun TestScreen() {
var size by remember { mutableStateOf(Size.Zero) }
val swipeableState = rememberSwipeableState(SwipeDirection.Initial)
val density = LocalDensity.current
val boxSize = 60.dp
val width = remember(size) {
if (size.width == 0f) {
1f
} else {
size.width - with(density) { boxSize.toPx() }
}
}
val scope = rememberCoroutineScope()
if (swipeableState.isAnimationRunning) {
DisposableEffect(Unit) {
onDispose {
when (swipeableState.currentValue) {
SwipeDirection.Right -> {
println("swipe right")
}
SwipeDirection.Left -> {
println("swipe left")
}
else -> {
return@onDispose
}
}
scope.launch {
// in your real app if you don't have to display offset,
// snap without animation
// swipeableState.snapTo(SwipeDirection.Initial)
swipeableState.animateTo(SwipeDirection.Initial)
}
}
}
}
Box(
modifier = Modifier
.fillMaxWidth()
.onSizeChanged { size = Size(it.width.toFloat(), it.height.toFloat()) }
.clickable { }
.swipeable(
state = swipeableState,
anchors = mapOf(
0f to SwipeDirection.Left,
width / 2 to SwipeDirection.Initial,
width to SwipeDirection.Right,
),
thresholds = { _, _ -> FractionalThreshold(0.3f) },
orientation = Orientation.Horizontal
)
.background(Color.LightGray)
) {
Box(
Modifier
.offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
.size(boxSize)
.background(Color.DarkGray)
)
}
}
结果:
关于android - 如果我想在滑动后调用操作,如何在 Compose 中实现滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69101453/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!