如何创建一个将触摸事件阻止到其下方 UI 的覆盖层?
How to create an overlay that blocks touch events to UI below it?
我使用了一层带有半透明背景的框架布局来创建叠加层。
但是这个叠加层不会阻止触摸事件与其下方的视图进行交互。
应如何创建阻止所有触摸事件的叠加层?
如果叠加层没有获得触摸事件,那么事件将传递给底层视图,因此要阻止其下方视图中的触摸事件,请使您的叠加层可触摸。 android:clickable="true"
将按钮放在叠加层上 layer.then 设置该按钮 android:background="@null" 它会阻止下方视图的触摸事件..希望它能解决您的问题
以下代码将在所有内容之上添加叠加层:
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;
}
})
以下代码对我有用。我添加了 android:clickable="true"
来阻止触摸事件到它下面的其他视图。
这是一个在叠加层中包含 ProgressBar 的示例。如果您不需要 ProgressBar,可以使用没有它的 FrameLayout。
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
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_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"/>
</FrameLayout>
改进 Blesson Jose 答案,如果您使用 View 来阻止触摸,则需要设置 android:focusable="true"
和 android:clickable="true"
。
我使用了一层带有半透明背景的框架布局来创建叠加层。 但是这个叠加层不会阻止触摸事件与其下方的视图进行交互。 应如何创建阻止所有触摸事件的叠加层?
如果叠加层没有获得触摸事件,那么事件将传递给底层视图,因此要阻止其下方视图中的触摸事件,请使您的叠加层可触摸。 android:clickable="true"
将按钮放在叠加层上 layer.then 设置该按钮 android:background="@null" 它会阻止下方视图的触摸事件..希望它能解决您的问题
以下代码将在所有内容之上添加叠加层:
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;
}
})
以下代码对我有用。我添加了 android:clickable="true"
来阻止触摸事件到它下面的其他视图。
这是一个在叠加层中包含 ProgressBar 的示例。如果您不需要 ProgressBar,可以使用没有它的 FrameLayout。
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
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_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"/>
</FrameLayout>
改进 Blesson Jose 答案,如果您使用 View 来阻止触摸,则需要设置 android:focusable="true"
和 android:clickable="true"
。