Jetpack:023-Jetpack中的事件二

本文介绍了Jetpack库中如何在Compose中使用pointerInput修饰符处理单击、双击、长按和滑动等低级事件,通过detectTapGestures和detectDragGestures参数实现事件响应,并提供了示例代码和总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们在上一章回中介绍了 Jetpack中事件相关的内容,本章回中继续介绍这方面的内容。闲话休提,让我们一起Talk Android Jetpack吧!

1. 知识回顾

我们在上一章回中介绍了事件的概念,主要介绍的是高级事件,本章回中将介绍低级事件,与高级事件相比,低级事件的功能更别强大一些,比如可以获取到事件的坐标偏移值。

低级事件的分类和高级事件相同,也分为单击,双击,长按和滑动这几种。本章回中将介绍如何在程序中响应这些事件。

2. 使用方法

低级事件通过ModifierpointerInput修饰符来响应,该修饰符中包含detectTapGesturesdetectDragGestures两种参数,前者用来响应各种点击事件,后者用来响应滑动事件,接下来我们将依据事件的种类来介绍如何响应不同的事件。

2.1 单击事件

在compose中,单击事件通过detectTapGestures中的onPressonTap参数来响应,其中onPress先触发,onTap后触发,它们类似View事件中的Event_Down和Event_Up事件,分别表示单击事件中的落下与弹起。我们将在稍后的小节中通过具体的代码来演示它们的用法。

2.2 双击事件

在compose中,双击事件通过detectTapGestures中的onDoubleTap参数来响应,它的用法类似Button中的onClick参数,我们将在稍后的小节中通过具体的代码来演示它的用法。

2.3 长按事件

在compose中,长按事件通过detectTapGestures中的onLongPress参数来响应,它的用法类似Button中的onClick参数,我们将在稍后的小节中通过具体的代码来演示它的用法。
大家注意一下:上面介绍的这三种事件都使用了相同的修饰符:detectTapGestures,只是修饰符中的参数名称不同。

2.4 滑动事件

在compose中,滑动事件通过detectDragGestures修饰符来响应,该修饰中包含的参数如下:

suspend fun PointerInputScope.detectDragGestures(
    onDragStart: (Offset) -> Unit = { },
    onDragEnd: () -> Unit = { },
    onDragCancel: () -> Unit = { },
    onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
)

大家从参数的名称就可以看出各个参数的作用来,我们重点介绍一下onDrag参数,它主要用来响应滑动事件,它包含两个参数,详细的功能如下:

  • change参数:主要用来计算滑动过程的各种数值;
  • dragAmount参数:主要用来获取滑动过程中的坐标偏移值;

关于滑动的理论内容先介绍这些,我们将在稍后的小节中通过具体的代码来演示它们的用法。

3. 示例代码

Column(
    modifier = Modifier
        .padding(paddingValue)
        .fillMaxSize(),
    verticalArrangement = Arrangement.spacedBy(24.dp),
    horizontalAlignment = Alignment.CenterHorizontally
) {

    //pointerInput修饰符用来检测tap和drag手势
    Text(modifier = Modifier.pointerInput(Unit) { detectTapGestures(
        //先运行onPress再运行onTap,onPress相当于View中的EventDown,onTap相当于Up
        //通过参数offset可以获取到偏移值
        onTap = { offset -> str = "onTap: $offset" },
        onDoubleTap = {str = "onDoubleTap"},
        onPress = {offset -> str = "onPress: $offset"},
        onLongPress = {str = "onLongPress"}
    ) },
        text = str)



    var offsetX by remember { mutableStateOf(0f) }
    var offsetY by remember { mutableStateOf(0f) }

    //响应复杂的拖动
    Box(modifier = Modifier
        .size(200.dp)
        .background(color = Color.Yellow)
    ) {
        Text(modifier = Modifier
            .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
            .size(60.dp)
            .background(color = Color.Green)
            .pointerInput(Unit) {
                detectDragGestures { change, dragAmount ->
                    change.consume()
                    //change中包含的全是偏移值,原始坐标值如何查看
                    Log.d(TAG, "EventMainScreen: $change")
                    offsetX += dragAmount.x
                    offsetY += dragAmount.y
                }
            },
            text ="Drag"
        )
    }
}

我们在上面的示例代码中演示了单击,双击,长按和滑动这几种事件的响应方法,与上一章回中不同的是,代码中使用了不同的修饰符,我们把这些事件绑定到了Text上,当发出不同的事件时Text显示不同的事件名称,这点和上一章回中的运行效果相同,因此我们就不演示运行效果了。

在响应滑动事件时,我们修改了Text的位置,因此它不但会显示偏移的坐标值还会跟着滑动事件一起移动,这里的移动比上一章回中的移动范围广,上一章回中只限于水平移动,这里的移动是任意方向的移动。下面是程序的运行效果图,请大家参考:
在这里插入图片描述

4. 内容总结

最后,我们将对本章回的内容做全面的总结:

  • compose中的低级事件通过pointerInput修饰符来响应;
  • pointerInput包含两种不同的参数:detectTapGestures和detectDragGestures;
  • detectTapGestures主要用来响应单击,双击和长按事件;
  • detectDragGestures主要用来响应滑动事件;

看官们,与Jetpack中事件相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值