我们在上一章回中介绍了事件的概念,主要介绍的是高级事件,本章回中将介绍低级事件,与高级事件相比,低级事件的功能更别强大一些,比如可以获取到事件的坐标偏移值。
低级事件的分类和高级事件相同,也分为单击,双击,长按和滑动这几种。本章回中将介绍如何在程序中响应这些事件。
低级事件通过Modifier
的pointerInput
修饰符来响应,该修饰符中包含detectTapGestures
和detectDragGestures
两种参数,前者用来响应各种点击事件,后者用来响应滑动事件,接下来我们将依据事件的种类来介绍如何响应不同的事件。
在compose中,单击事件通过detectTapGestures
中的onPress
和onTap
参数来响应,其中onPress先触发,onTap后触发,它们类似View事件中的Event_Down和Event_Up事件,分别表示单击事件中的落下与弹起。我们将在稍后的小节中通过具体的代码来演示它们的用法。
在compose中,双击事件通过detectTapGestures
中的onDoubleTap
参数来响应,它的用法类似Button中的onClick
参数,我们将在稍后的小节中通过具体的代码来演示它的用法。
在compose中,长按事件通过detectTapGestures
中的onLongPress
参数来响应,它的用法类似Button中的onClick参数,我们将在稍后的小节中通过具体的代码来演示它的用法。
大家注意一下:上面介绍的这三种事件都使用了相同的修饰符:detectTapGestures
,只是修饰符中的参数名称不同。
在compose中,滑动事件通过detectDragGestures
修饰符来响应,该修饰中包含的参数如下:
suspend fun PointerInputScope.detectDragGestures(
onDragStart: (Offset) -> Unit = { },
onDragEnd: () -> Unit = { },
onDragCancel: () -> Unit = { },
onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
)
大家从参数的名称就可以看出各个参数的作用来,我们重点介绍一下onDrag
参数,它主要用来响应滑动事件,它包含两个参数,详细的功能如下:
关于滑动的理论内容先介绍这些,我们将在稍后的小节中通过具体的代码来演示它们的用法。
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中事件相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!