在普通视图中,我们可以有onTouchEvent
override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action) {
MotionEvent.ACTION_DOWN -> {}
MotionEvent.ACTION_MOVE -> {}
MotionEvent.ACTION_UP -> {}
else -> return false
}
invalidate()
return true
}
在Jetpack组合中,我只能发现修改器中有tapGestureFilter
,它只接受ACTION_UP
的操作。
Modifier
.tapGestureFilter { Log.d("Track", "Tap ${it.x} | ${it.y}") }
.doubleTapGestureFilter { Log.d("Track", "DoubleTap ${it.x} | ${it.y}") }
Jetpack合成是否有等效的onTouchEvent
?
4条答案
按热度按时间ippsafx71#
我们有一个单独的package,这是非常有用的。有两个主要的扩展函数适合你:
pointerInput
-文档pointerInteropFilter
-文档如果你想处理这个事件,我推荐使用
pointerInteropFilter
,它类似于View.onTouchEvent
,和modifier
沿着使用:这将是将调整后的代码合成到指定的
View.onTouchEvent
样本。P.S.不要忘记
@ExperimentalPointerInput
注解。kkih6yb82#
如果您不使用与现有View代码互操作的Touch API,则
pointerInteropFilter
不是首选使用方式。一个特殊的PointerInputModifier,用于提供对最初调度到Compose的基础MotionEvent的访问。请首选pointerInput,并仅将其用于与使用MotionEvent的现有代码进行互操作。虽然此修饰符的主要目的是允许任意代码访问调度到Compose的原始MotionEvent,但为了完整起见,提供了类似物,使得任意代码能够像Android View一样与系统交互。
您可以将
pointerInput
、awaitTouchDown
用于MotionEvent.ACTION_DOWN
,将awaitPointerEvent
用于MotionEvent.ACTION_MOVE
和MotionEvent.ACTION_UP
关于手势的一些要点
1.如果子节点和父节点正在侦听输入更改,则它会从内部子节点传播到外部子节点,然后再传播到父节点。
1.如果您不使用事件,其他事件(如滚动拖动)可能会干扰或使用事件,大多数事件在传播给它们之前会检查它是否已使用
示例的检测拖拽手势源代码
1.所以当你需要阻止其他事件被拦截时
在
awaitFirstDown
之后调用pointerInputChange.consumeDown()
,在awaitPointerEvent
之后调用指针输入更改.消费位置更改()awaitFirstDown()
有requireUnconsumed
参数,默认为true。如果你把它设置为false,即使pointerInput在你的手势之前消耗了down,你仍然会得到它。这也是像drag这样的事件如何使用它来获得第一个down的。1.您看到的每个可用事件
detectDragGestures
、detectTapGestures
甚至awaitFirstDown
都使用awaitPointerEvent
来实现,因此使用awaitFirstDown
、awaitPointerEvent
和消耗更改,您可以配置自己的手势。例如,这是一个从原始
detectTransformGestures
定制的函数i,它只在特定数目的指针向下时被调用。编辑
自1.2.0-beta01起,不建议使用
PointerInputChange.consemePositionChange()
、PointerInputChange.consumeDownChange()
等部分使用以及用于使用所有更改的部分使用PointerInputChange.consumeAllChanges()
是唯一用于防止其它手势/事件的一个。
我也有一个教程在这里,涵盖手势的细节
zujrkrfu3#
也许有点晚了,但由于compose是不断更新的,这就是我今天的做法:
我们还有
detectHorizontalDragGestures
和detectVerticalDragGestures
等帮助我们。PS:
1.0.0-beta03
kqhtkvqz4#
在做了一些研究之后,看起来可以使用
dragGestureFilter
,与tapGestureFilter
混合使用仍然使用
tagGestureFilter
的原因是onStop
不提供位置,而仅提供速度,因此tapGestureFilter
确实有助于提供最后位置(如果需要)