如何创建一个覆盖层来阻止触摸事件到它下面的 UI?

Posted

技术标签:

【中文标题】如何创建一个覆盖层来阻止触摸事件到它下面的 UI?【英文标题】:How to create an overlay that blocks touch events to UI below it? 【发布时间】:2015-03-01 10:05:20 【问题描述】:

我使用了一层带有半透明背景的框架布局来创建叠加层。 但是这个覆盖不会阻止触摸事件与它下面的视图交互。 应该如何创建一个覆盖所有触摸事件的覆盖?

【问题讨论】:

How to disable behind view click event Framelayout的可能重复 【参考方案1】:

如果叠加层没有获得触摸事件,则事件将传递给底层视图,因此要阻止其下方视图中的触摸事件,请使您的叠加层可触摸。 android:clickable="true"

【讨论】:

此方法有效,除非您打开 android 键盘并以编辑文本为焦点:键盘仍会拦截触摸事件 我想将触摸传递到屏幕下方。 ***.com/q/51924911/3496570请看一下 难以置信!最佳解决方案!【参考方案2】:

以下代码将在所有内容之上添加叠加层:

View v1 = new View(this);    
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
 1000,
 50,
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
 PixelFormat.OPAQUE);

params.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.addView(v1, params);

要阻止触摸事件,您必须更改标志或以下代码将起作用:

protected boolean onTouchEvent (MotionEvent me) 
    return true;

对于 v1,您需要进行导入:

import android.view.View.OnTouchListener;

然后设置onTouchListener:

v1.setOnTouchListener(new OnTouchListener() 
    @Override
    public boolean onTouch(View v, MotionEvent event) 
        return true;
    
)

【讨论】:

我怎么不记得触摸监听器了? +1 我想将触摸传递到屏幕下方。 ***.com/q/51924911/3496570请看一下【参考方案3】:

以下代码对我有用。我添加了android:clickable="true" 来阻止触摸事件到它下面的其他视图。

这是一个在叠加层内带有 ProgressBar 的示例。如果你不想要 ProgressBar,你可以使用没有它的 FrameLayout。

<FrameLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/progress_overlay"
            android:layout_
            android:layout_
            android:alpha="0.4"
            android:animateLayoutChanges="true"
            android:background="@android:color/black"
            android:visibility="gone"
            android:clickable="true">

            <ProgressBar
                style="?android:attr/progressBarStyleLarge"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:indeterminate="true"/>

</FrameLayout>

【讨论】:

【参考方案4】:

改进 Blesson Jose 答案,如果您使用 View 来阻止触摸,则需要设置 android:focusable="true"android:clickable="true"

【讨论】:

【参考方案5】:

将按钮放在覆盖层上。然后将该按钮设置为 android:background="@null" 它会阻止其下方视图的触摸事件..希望它能解决您的问题

【讨论】:

以上是关于如何创建一个覆盖层来阻止触摸事件到它下面的 UI?的主要内容,如果未能解决你的问题,请参考以下文章

将触摸事件从覆盖 UIView 转发到 UIWebView / 如何从代码将触摸事件发送到 uiwebview

带有 UITapGestureRecognizer 的 UIView 通过拖动到它下面的 UITableView ?

如何将触摸事件从 ScrollView 子视图传递到它的父视图

使用后将覆盖 UIView 的触摸事件转发到下面的 UIScrollView

iOS中的触摸事件转发

如何阻止 ExpandableListView 窃取子触摸事件?