ACTION_POINTER_DOWN未传播到同级视图

ACTION_POINTER_DOWN not propagating to sibling view

提问人:Jason H 提问时间:10/3/2023 最后编辑:Jason H 更新时间:10/3/2023 访问量:20

问:

在我的布局中,我有一个包含一个 (buttonContainer) 和一个 (mywebView) 的顶部。buttonContainer 还包含 Buttons,但对于它们的 onTouch 事件,我总是让 buttonContainer 处理触摸事件。(我这样做是为了将手指滑动到按钮上以激活它。FrameLayoutFrameLayoutWebviewreturn false;

我遇到的问题是,如果我用手指按在我的手指上,然后在我知道会按的位置上按第二根手指,则该事件不会向下传播到 webview。buttonContanierbuttonContainerreturn false;

MotionEvent.ACTION_POINTER_DOWN并且事件没有传递到我的 webview,即使它们的处理方式与工作方式相同,我知道 onTouch 事件为这些事件返回 false。MotionEvent.ACTION_POINTER_UPMotionEvent.ACTION_DOWNMotionEvent.ACTION_UP

MotionEvent.ACTION_POINTER_DOWN并且仅当前面有 和 事件时才在我的 Web 视图上工作,但是一旦我有一个活动指针,它们就不再起作用,直到我释放该指针。MotionEvent.ACTION_POINTER_UPMotionEvent.ACTION_DOWNMotionEvent.ACTION_UPbuttonContainer

如果buttonContainer不使用这些事件,有没有办法允许这些事件传播到我的WebView?

当我知道事件不会被使用时,我尝试将事件显式发送到我的 webView。事件被发送到我的 webView,但所需的操作没有发生,它们似乎被忽略了。因此,我尝试在事件进入 webview 之前修改事件,将操作设置为指针 0 上的ACTION_DOWN。这有效,但随后它会中断 webview 上的滚动。(我也尝试了相同的修改动作事件,结果相同)mywebView.dispatchTouchEvent(event);

下面是 buttonContainer onTouch:

private void setupButtonTouchListeners() {
        mButtonsContainer.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                boolean buttonActionPerformed = false;
                int action = event.getActionMasked();
                int pointerIndex = event.getActionIndex(); // Index of the pointer that triggered the event
                int pointerId = event.getPointerId(pointerIndex); // Get the pointer ID
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_POINTER_DOWN:
                        // Handle button pressed event
                        for (CustomButton button : mButtons) {
                            if (button.isWithinButtonBounds(event, pointerIndex)) {
                                if (button.setPressed(true, pointerId)) {
                                    buttonActionPerformed = true;
                                }
                            }
                        }
                        break;
                    case MotionEvent.ACTION_MOVE:
                        for (int i = 0; i < event.getPointerCount(); i++) {
                            int currentPointerId = event.getPointerId(i);
                            for (CustomButton button : mButtons) {
                                if (button.isWithinButtonBounds(event, i)) {
                                    if (button.setPressed(true, currentPointerId)) {
                                        buttonActionPerformed = true;
                                    }
                                } else {
                                    if (joystickMode) {
                                        if (button.setPressed(false, currentPointerId)) {
                                            Log.i("APPLOG", "ACTION UP EVENT action preformed");
                                            buttonActionPerformed = true;
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_POINTER_UP:
                    case MotionEvent.ACTION_CANCEL:
                        for (CustomButton button : mButtons) {
                            if (button.setPressed(false, pointerId)) {
                                //Log.i("APPLOG", "ACTION UP EVENT action preformed");
                                buttonActionPerformed = true;
                            }
                        }
                        if (!buttonActionPerformed) {
                            Log.i("APPLOG", "Up press no action on pointer: " + event.getPointerId(pointerIndex));
                        }
                        break;
                }

                if (buttonActionPerformed) {
                    //Log.i("APPLOG", "ACTION preformed");
                    return true; // Consume the touch event
                } else {
                    //Log.i("APPLOG", "No action at all");
                    return false; // Let the touch propagate to the WebView
                }
            }
        });
    }

该方法只返回是否在按钮上预先形成操作。同样,按钮的行为方式都是我想要的,只有当buttonContainer已经有一个acvitve指针时,后续的触摸事件才会在webView上发生。button.setPressed

java android webview 触摸事件 motionevent

评论


答: 暂无答案