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窗口置于所有窗口之上。感谢您的想法:)它可能会破坏您的对话框片段,但是(即隐藏它们)。是否有可能在不重写方法的情况下这样做?