提问人:Jason H 提问时间:10/3/2023 最后编辑:Jason H 更新时间:10/3/2023 访问量:20
ACTION_POINTER_DOWN未传播到同级视图
ACTION_POINTER_DOWN not propagating to sibling view
问:
在我的布局中,我有一个包含一个 (buttonContainer) 和一个 (mywebView) 的顶部。buttonContainer 还包含 Buttons,但对于它们的 onTouch 事件,我总是让 buttonContainer 处理触摸事件。(我这样做是为了将手指滑动到按钮上以激活它。FrameLayout
FrameLayout
Webview
return false;
我遇到的问题是,如果我用手指按在我的手指上,然后在我知道会按的位置上按第二根手指,则该事件不会向下传播到 webview。buttonContanier
buttonContainer
return false;
MotionEvent.ACTION_POINTER_DOWN
并且事件没有传递到我的 webview,即使它们的处理方式与工作方式相同,我知道 onTouch 事件为这些事件返回 false。MotionEvent.ACTION_POINTER_UP
MotionEvent.ACTION_DOWN
MotionEvent.ACTION_UP
MotionEvent.ACTION_POINTER_DOWN
并且仅当前面有 和 事件时才在我的 Web 视图上工作,但是一旦我有一个活动指针,它们就不再起作用,直到我释放该指针。MotionEvent.ACTION_POINTER_UP
MotionEvent.ACTION_DOWN
MotionEvent.ACTION_UP
buttonContainer
如果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
答: 暂无答案
评论