显然答案有些简单,虽然它确实让你扩展 DrawerLayout 并做一些思考,并且可能会导致一些奇怪的结果(使用 LAST
例如,我还没有看到任何东西)。
无论如何,向后看的相关问题可以帮助理解问题(稍后将解释第一个问题):
1.DrawerLayout prevents call of MainActivity.onTouchEvent()
2.How can I requestDisallowTouchEvents on Android DrawerLayout
3.Set drag margin for Android Navigation Drawer
回答
首先,请注意我在这里放了很多例子。如果您只想要最好的(对我而言),请跳到最后一个。
其次,如果有人有足够的声誉,请评论第一个链接的问题并放置一个指向这个答案的链接(它可以帮助那个人)。
示例 1
好吧,基本上,只需扩展 Android 的 DrawerLayout 并将 onTouchEvent() 替换为:
@Override
public boolean onTouchEvent(MotionEvent arg0) {
super.onTouchEvent(arg0);
return false;
}
这个解决方案可以做任何事情,除了它不会在幻灯片上打开抽屉,只有菜单点击等。此外,它会转发点击,因此当抽屉打开时
例如,触摸它的外部不会关闭它,而是单击后面的任何内容(例如 ListView)。让我们更加努力……
示例 2
现在,让我们捕捉打开的或可见的情况,以返回 true(并在抽屉中使用操作)。
@Override
public boolean onTouchEvent(MotionEvent arg0) {
super.onTouchEvent(arg0);
if(isDrawerOpen(findViewById(R.id.list_slidermenu)) ||
isDrawerVisible(findViewById(R.id.list_slidermenu))){
return true;
}
return false;
}
此解决方案更好,因为它可以防止在抽屉打开甚至可见(幻灯片开始...)时点击抽屉后面。但是触摸滑动它仍然不起作用。
示例 3
好的,所以让我们拆分案例。触摸抽屉边缘内的(MotionEvent.ACTION_DOWN)(Google 打算在触摸时滑动抽屉的区域)
将导致返回 True 来消费该动作,而其他人将转发该事件(返回 False)。
@Override
public boolean onTouchEvent(MotionEvent arg0) {
super.onTouchEvent(arg0);
float edge = 30;//that's for a left drawer obviously. Use <parentWidth - 30> for the right one.
View mDrawerListView = findViewById(R.id.drawer_listview);
if(isDrawerOpen(mDrawerListView) ||
isDrawerVisible(mDrawerListView)){
return true;
} else if(arg0.getAction() == MotionEvent.ACTION_DOWN && arg0.getX() > edge){
return false;
}
return true;
}
请注意,我使用的是 30dp。这就是我发现的边距(尽管在其中一个链接中据说是 20....)。
好吧,下一个示例当然是根据 Android 来确定边(见上面的代码)值究竟是什么。我们不想
使用一个可以改变的数字或其他什么。
新问题
所以现在第一个链接应该派上用场了。它“破解”抽屉代码以获取抽屉边缘/megin 编号。但是,它对我不起作用,因为找不到那些确切的字段名称。
我运行 mDrawerLayout.getClass().getField() 它返回所有字段,但没有任何运气找到我们想要的。任何人?
最后一个示例 - 完整代码
好的,看示例 3,在了解我到底做了什么之后,我们可以通过扩展 onFinishInflate() 方法并将其保存为全局变量来使其更快
供此 CustomDrawerLayout 供以后使用。我们还可以将第一个“if”放在第二个中,以节省更多工作。好的,这里是:
View mDrawerListView;
...
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mDrawerListView = findViewById(R.id.drawer_listview);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if(event.getX() > 30 && event.getAction() == MotionEvent.ACTION_DOWN){
if(isDrawerOpen(mDrawerListView) || isDrawerVisible(mDrawerListView)){
return true;
} else{
return false;
}
}
return true;
}
现在就是这样!希望以后能对自己以外的人有所帮助,呵呵....