Compose onDragStart

@Composable
private fun DraggableTextLowLevel() {
    Box(modifier = Modifier.fillMaxSize()) {
        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }

        Box(
            Modifier
                .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                .background(Color.Blue)
                .size(50.dp)
                .pointerInput(Unit) {
                    detectDragGestures(onDragEnd={
                        Log.e("DragDemo","onDragEnd")
                    },
                        onDragStart = {
                            Log.e("DragDemo","onDragStart")
                        }
                        ) { change, dragAmount ->
                        change.consume()
                        offsetX += dragAmount.x
                        offsetY += dragAmount.y
                    }
                }
        )
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android Jetpack Compose 中,可以将点击和拖动的功能分别封装成 Clickable 和 Draggable 两个 Composable 函数,并将它们组合起来使用,实现同时实现点击和拖动的效果。 Clickable Composable 函数用于监听点击事件,返回一个布尔值表示是否消耗了点击事件。 ```kotlin @Composable fun Clickable( onClick: () -> Unit, children: @Composable () -> Unit ) { val state = remember { mutableStateOf(false) } val gesture = remember { MutableInteractionSource() } val clickableModifier = Modifier.pointerInput(Unit) { detectTapGestures( onPress = { state.value = true }, onRelease = { if (state.value) onClick() }, onCancel = { state.value = false }, onTap = { state.value = false } ) gesture.tryAwaitRelease() } Box( modifier = clickableModifier, propagateMinConstraints = true, propagateMaxConstraints = true ) { children() } } ``` Draggable Composable 函数用于监听拖动事件,返回拖动后的位置。 ```kotlin @Composable fun Draggable( state: DragState, onDrag: (Offset) -> Unit, children: @Composable () -> Unit ) { val offsetX = state.position.x val offsetY = state.position.y val density = LocalDensity.current.density val draggableModifier = Modifier.pointerInput(Unit) { detectDragGestures( onDragStart = { state.isDragging = true }, onDragEnd = { state.isDragging = false }, onDrag = { change, dragAmount -> state.position += dragAmount / density onDrag(state.position) change.consumePositionChange() } ) } Box( modifier = draggableModifier.offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }, propagateMinConstraints = true, propagateMaxConstraints = true ) { children() } } class DragState(var isDragging: Boolean = false, var position: Offset = Offset.Zero) ``` 使用 Clickable 和 Draggable 组合实现同时点击和拖动的效果。 ```kotlin @Composable fun ClickableAndDraggable( onClick: () -> Unit, onDrag: (Offset) -> Unit, children: @Composable () -> Unit ) { val state = remember { DragState() } Draggable( state = state, onDrag = onDrag, children = { Clickable( onClick = onClick, children = children ) } ) } ``` 调用 ClickableAndDraggable 函数即可实现同时点击和拖动的效果。 ```kotlin var position by remember { mutableStateOf(Offset.Zero) } ClickableAndDraggable( onClick = { /* 处理点击事件 */ }, onDrag = { p -> position = p } ) { Box( Modifier .background(Color.Red) .size(50.dp) ) { Text("Drag me!", Modifier.align(Alignment.Center)) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值