java - Topmost View 吞下触摸事件,因为重叠

标签 java android android-layout android-view android-custom-view

这是我的布局结构:

- RelativeLayout (full screen)
  - FrameLayout (full screen)
  - Button (in the middle of the screen)
  - RecyclerView (align parent bottom but with very big padding top to 
    capture the scrolling also in the top of the screen, so it's basically acting like a full screen `RecyclerView`)

是的,这些 View 相互重叠。

因为 RecyclerView 是最顶层的 View ,它捕获屏幕上的所有触摸事件,并吞下它们,防止任何触摸“通过它”到它下面的底层 View 。 (注意:对于底层 View ,我不是指 RecyclerView 的子级,而是其他 rootview 的 子级)

我已经阅读了大量关于传播触摸事件和防止吞咽触摸事件等的 stackoverflow 帖子,尽管这看起来很容易完成,但我无法实现以下效果:

我想让我的 RecyclerView 捕捉触摸事件,这样它就会滚动或发生其他情况。但我希望 rootView 认为 RecyclerView 没有捕获事件,并继续将它传递给它的其他子级(rootview' 的 child )。

这是我尝试做的事情:

1。重写 RecyclerViewdispatchTouchEvent 以执行其逻辑并返回 false 以作为它没有分派(dispatch)其触摸事件的行为,因此 Root View 将继续迭代以通过其 subview 进行触摸。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    super.dispatchTouchEvent(ev);
    return false;
}

发生了什么:

RecyclerView 仍然有效,但仍然吞噬所有触摸事件(与以前一样)

2。重写 RecyclerViewonTouchEvent 以执行其逻辑并返回 false。 (注意:我知道这似乎不是解决方案,但我试过了)

@Override
public boolean onTouchEvent(MotionEvent e) {
    super.onTouchEvent(e);
    return false;
}

发生了什么:

与#1 相同的结果

我已经用同样的想法做了一些调整,但它们并没有奏效,所以我现在有点无能为力,希望得到你们的帮助!

最佳答案

我有两个建议给你:
第一个更简单,但假设您要单击 Button,它可以出现在 RecyclerView 上方,如果是这种情况,您可以只需更改布局的顺序:

- RelativeLayout (full screen)
  - FrameLayout (full screen)
  - RecyclerView
  - Button (in the middle of the screen)

如果你需要更通用的东西,那么可以这样做:

recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int [] pos = new int[2];
                recyclerView.getLocationOnScreen(pos);
                Rect rect = new Rect();
                button.getHitRect(rect);
                if (rect.contains((int) event.getX() + pos[0], (int) event.getY() + pos[1])) {
                    button.onTouchEvent(event);
                }
                return false;
            }
        });

您将需要单独处理所有 View ,这不是很好,但在我的测试中有效。

注意:如果您已将 addOnItemTouchListener 添加到您的 RecyclerView,您将需要将上述功能添加到 onInterceptTouchEvent(或到两个地方,取决于您的项目和 RecyclerView)。

关于java - Topmost View 吞下触摸事件,因为重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894937/

相关文章:

android - 如何从特定项目位置开始显示 ListView

android - 使用 xml 在 android 中自定义形状

android - 出现软键盘时布局不会向上推

android - 如果应用程序被反编译,GoogleAuthUtils.getToken() 的安全性如何

Android Jetpack Compose 宽度/高度/尺寸修饰符 vs requiredWidth/requiredHeight/requiredSize

java - 匹配前面没有文字的电话号码

java - groovy intelliJ "angle brackets (<>)"修改代码样式设置

java - 由于持续的 GC,强制 JVM 崩溃

JavaFx 未显示在首选项窗口中

android - 无法将数据添加到 firebasedatabse