【发布时间】:2014-01-10 09:11:50
【问题描述】:
我有一个应用程序覆盖MainActivity 的onTouchEvent(MotionEvent ev) 以确定Two-Finger-Swipe 和Pich-Open/Pinch-Close。
在我将DrawerLayout 添加到应用程序之前,一切正常(就像Creating a Navigation Drawer 中描述的那样)。问题:DrawerLayout 阻止在 MainActivity 中调用onTouchEvent()。
我开始写CustomDrawerLayout,并尝试覆盖DrawerLayout方法onInterceptTouch()和onTouchEvent()。
将TouchEvent 传输到 MainActivity 的唯一方法(我发现):
// onTouchEvent of CustomDrawerLayout
@Override
public boolean onTouchEvent(MotionEvent ev){
// super.onTouchEvent(ev); // prevent transmission of TouchEvent
return false;
}
这里的问题是抽屉没有正确打开。抽屉卡在这篇文章中描述的那样: DrawerLayout getting stuck on swipe。
是否可以将TouchEvent 传输到 MainActivity 以处理 MultiTouchDetection?还是我必须在CustomDrawerLayout 处理这个?
更新 1
首先我不得不说,如果我从左边缘滑动,抽屉只会卡住。通过单击ActionBar 中的 DrawerIcon,Drawer 可以正常工作。
TouchEvent 的传输使用以下代码。但只有在抽屉打开的情况下!否则 Activity.onTouchEvent 不会被调用!
// onTouchEvent of CustomDrawerLayout
@Override
public boolean onTouchEvent(MotionEvent ev){
// super.onTouchEvent(ev); // still prevents transmission of TouchEvent
activity.onTouchEvent(ev);
return true;
}
通过从边缘滑动打开抽屉(-> 抽屉卡住),我得到了一个非常奇怪的行为:
- 只有 DrawerIcon 可以关闭“卡住的抽屉”(-> 我不希望有什么不同,因为我覆盖了
CustomDrawerLayout.onTouchEvent) - 如果我通过 DrawersIcon 关闭卡住的抽屉,
CustomDrawerLayout.onTouchEvent仍会被调用
真奇怪!为什么不调用Activity.onTouchEvent()?我怎样才能防止卡住的抽屉?
更新 2
现在我覆盖CustomDrawerLayout.onInterceptTouch():
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
return true;
}
这具有无法通过从边缘滑动打开抽屉的效果 -> 只有 DrawersIcon 可以打开和关闭抽屉。但是现在TouchEvent 总是被传输到 Activity(-> 像预期的那样工作)。
但我真正想要的是有可能通过从边缘滑动打开抽屉 AND 来拥有我的 MultiGestureDetector。这可能吗?
【问题讨论】:
-
从您的 CustomDrawerLayout 的 onTouchEvent 返回
true,您为什么不尝试调用activity.onTouchEvent(ev);? -
酷!
TouchEvent被传输到Activity。但抽屉仍然卡住......有什么想法吗? -
您在 CustomDrawerLayout 的 onTouchEvent 中返回 true 吗?
-
我更详细地测试了您的建议并更新了我的问题。谢谢:)
-
尝试了第二种可行的解决方案(更新 2),但它不是 100% 我想要的......
标签: android touch-event drawerlayout