【问题标题】:android jetpack compose: ACTION_UP only reached for tap but not after ACTION_MOVE when using pointerInteropFilterandroid jetpack compose:使用 pointerInteropFilter 时,ACTION_UP 仅在点击时达到,但在 ACTION_MOVE 后未达到
【发布时间】:2022-09-30 19:10:38
【问题描述】:

在滚动后或在惰性列中点击(单击)后,我需要以编程方式滚动(以便捕捉项目以调整上下对称)。我还需要在应用程序启动时从特定项目开始 - 启动。

我正在使用 pointerInteropFilter 能够在这些操作中运行一些代码:向下、移动、向上。当我点击时代码运行正常,但在移动完成后它不会触发 ACTION_UP。

[这是我从屏幕上松开手指后想要的结果......即......“跳转”或滚动到在这种情况下为项目 10 和一些偏移量的值][1]

该代码仅适用于点击...但是当 Action_up 时协程不起作用

我读到我们被建议使用 \"prefer pointerInput] 并仅将其用于与

  • 消耗 [MotionEvent]s 的现有代码\"

它还说 pointerinteropFilter 尝试在视图和运动事件之间进行无缝处理......但我不知道它是否相关。

谢谢。

毛里西奥

@Composable
fun Greeting(name: String) {
    val listState2 = rememberLazyListState()
    val coroutineScope = rememberCoroutineScope()

    LazyColumn(
        state = listState2,
    ) {
        items (50) {index ->
                Text(
                    modifier = Modifier
                        .pointerInteropFilter {

                            when (it.action) {
                                MotionEvent.ACTION_DOWN -> {
                                    Log.i(ContentValues.TAG, \"down pressed\")
                                    false
                                }
                                MotionEvent.ACTION_MOVE -> {
                                    Log.i(ContentValues.TAG, \"moved done\")
                                    false
                                }

                                MotionEvent.ACTION_UP -> {
                                    coroutineScope.launch {
                                        listState2.scrollToItem(10, 28)
                                    }
                                    Log.i(ContentValues.TAG, \"up detected\")
                                }

                                MotionEvent.ACTION_CANCEL -> {
                                    coroutineScope.launch {
                                        listState2.scrollToItem(10, 28)
                                    }
                                    Log.i(ContentValues.TAG, \"canceled chosen\")
                                    false
                                }

                                else ->
                                    false
                            }
                            true
                        },
                    text = \"item $index\",
                )
        }
    }
}```




  [1]: https://i.stack.imgur.com/vSiCG.png
  • 忘了说我尝试为父级(lazycolumn)标记 FALSE 以避免它消耗事件......但这并没有改变问题。

标签: pointers input android-jetpack-compose action motionevent


【解决方案1】:

我也遇到过同样的问题。

onClick= 函数不适用于放置在同一可组合 ConstraintLayout 中的所有后代,如果布局使用 .pointerInteropFilter 并作为捕获 ACTION_UP MotionEvent 的结果返回 true。

这与引擎盖下的可点击逻辑期望PressInteraction.Press 的事实有关,该值是来自ACTION_UP 的简单映射。因此 ConstraintLayout 通过捕获 ACTION_UP MoutionEvent 防止将 PressInteraction.Press 传递给后代。

如果 ConstraintLayout 将在 ACTION_UP MoutionEvent 上返回 false,那么下一次 MotionEvents 将不会被分派给它。因为在后台执行。

所以问题的根本原因是滥用Modifier.pointerInteropFilter。该函数背后的想法是过滤事件,它实际上是做什么的。

在我的情况下,看起来需要将触摸逻辑重写为Modifier.pointerInput

也许这些发现也会对您有所帮助

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多