我有一个实例,我需要一个GestureDetector
来Activity
拦截水平抛投。此活动也恰好包含一个DrawerLayout
.
我遇到的问题是DrawerLayout
拦截所有触摸事件,以至于我什至不能requestDisallowInterceptTouchEvents
。即使在 Activity 中触发该呼叫,我似乎也无法触摸。
我希望抽屉在关闭时处理从边缘滑动,在打开时从任何地方滑动,就像它应该做的那样。但是我需要我的活动能够在抽屉关闭时拦截其他地方的触摸事件。
我有一个实例,我需要一个GestureDetector
来Activity
拦截水平抛投。此活动也恰好包含一个DrawerLayout
.
我遇到的问题是DrawerLayout
拦截所有触摸事件,以至于我什至不能requestDisallowInterceptTouchEvents
。即使在 Activity 中触发该呼叫,我似乎也无法触摸。
我希望抽屉在关闭时处理从边缘滑动,在打开时从任何地方滑动,就像它应该做的那样。但是我需要我的活动能够在抽屉关闭时拦截其他地方的触摸事件。
不确定你是否解决了这个问题,但请确保你的 onTouch(View view, MotionEvent motionEvent){...} 方法返回 true 以指示处理了初始事件,否则抽屉布局将获得初始触摸开始事件无论您传递给 requestDisallowInterceptTouchEvents 什么,都会吞噬下一个。
不幸的是,SDK中的BasicGestureDetect示例从此方法返回false,当没有其他东西可以窃取这些事件并且您只是记录它们时,这很好,但是如果您将该代码复制粘贴到您的应用程序中期望它可以工作(像我一样),除了最初的触摸开始之外,您不会得到任何东西。
因此,BasicGestureDetect 示例中 MainActivity 中的这一部分:
actionFragment.getView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
gd.onTouchEvent(motionEvent);
return false;
}
});
应该改为:
actionFragment.getView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
gd.onTouchEvent(motionEvent);
return true;
}
});
您可以使用标志。DrawerListener上有一个 onDrawerSlide 方法,当您的抽屉位置发生变化时调用该方法,即抽屉正在运行以自行打开或关闭。您可以在此方法中设置一个标志,指示抽屉正在运行。然后,在 OnGestureListener 的onFling方法上,通过检查标志来显示抽屉是否正在运行。如果它没有运行,你可以在 onFling 方法中做任何你想做的事情,如果没有,不要做任何事情。
我希望它有帮助
http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.DrawerListener.html#onDrawerSlide(android.view.View, float)