Android 如何拦截所有触摸事件?

Android 如何拦截所有触摸事件?,android,Android,如何获取应用程序(包含活动和所有对话框片段的)的“顶部”视图?我需要截获所有触摸事件,以处理对话框片段和我的活动之间的一些视图的运动 我试图通过活动的窗口的装饰视图捕捉它们(事件),但运气不佳: getWindow().getDecorView().setOnTouchListener(...); 您可以覆盖以拦截活动中的所有触摸事件,即使您有一些视图(如ScrollView、Button等)将使用触摸事件 结合,可以禁用ViewGroup的触摸事件。例如,如果要禁用某个视图组中的所有触摸事件

如何获取应用程序(包含
活动
和所有
对话框片段
的)的“顶部”
视图
?我需要截获所有触摸事件,以处理
对话框片段
和我的
活动
之间的一些
视图
的运动

我试图通过活动的
窗口的装饰视图捕捉它们(事件),但运气不佳:

getWindow().getDecorView().setOnTouchListener(...);
您可以覆盖以拦截活动中的所有触摸事件,即使您有一些视图(如ScrollView、Button等)将使用触摸事件

结合,可以禁用ViewGroup的触摸事件。例如,如果要禁用某个视图组中的所有触摸事件,请尝试以下操作:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    requestDisallowInterceptTouchEvent(
            (ViewGroup) findViewById(R.id.topLevelRelativeLayout),
            true
    );
    return super.dispatchTouchEvent(event);
}

private void requestDisallowInterceptTouchEvent(ViewGroup v, boolean disallowIntercept) {
    v.requestDisallowInterceptTouchEvent(disallowIntercept);
    int childCount = v.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = v.getChildAt(i);
        if (child instanceof ViewGroup) {
            requestDisallowInterceptTouchEvent((ViewGroup) child, disallowIntercept);
        }
    }
}
@覆盖
公共布尔dispatchTouchEvent(MotionEvent){
请求不允许WinterCeptTouchEvent(
(视图组)findViewById(R.id.topLevelRelativeLayout),
真的
);
返回super.dispatchTouchEvent(事件);
}
私有void requestDisallowernCepttouchevent(视图组v,布尔值DisallowernCept){
v、 请求不允许WinterCeptTouchEvent(不允许WinterCept);
int childCount=v.getChildCount();
for(int i=0;i
如果您想知道如何在
对话框片段中截取所有触摸事件,请点击这里:

abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return object : Dialog(requireContext()){
            override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
                // do your thing here
                return super.dispatchTouchEvent(ev)
            }
        }
    }

}

重写Activity#dispatchTouchEvent(..)方法允许您在视图看到触摸事件之前拦截所有触摸事件。@Jens这是真的,但它不会拦截
DialogFragment
上的触摸(因为它可能属于另一个窗口)我猜你已经尝试过使用WindowManager#addView(..)@Jens nope将自己的TYPE_SYSTEM_ALERT窗口置于所有窗口之上。感谢您的想法:)它可能会破坏您的对话框片段,但是(即隐藏它们)。是否有可能在不重写方法的情况下这样做?