Jetpack:023-Jetpack中的事件二

文章目录

  • 1. 知识回顾
  • 2. 使用方法
    • 2.1 单击事件
    • 2.2 双击事件
    • 2.3 长按事件
    • 2.4 滑动事件
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中介绍了 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的位置,因此它不但会显示偏移的坐标值还会跟着滑动事件一起移动,这里的移动比上一章回中的移动范围广,上一章回中只限于水平移动,这里的移动是任意方向的移动。下面是程序的运行效果图,请大家参考:
Jetpack:023-Jetpack中的事件二_第1张图片

4. 内容总结

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

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

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

你可能感兴趣的:(一起Talk,AndroidJetPack吧,移动开发,jetpack,compose,pointerInput,事件响应)