如何在抽屉打开时制作活动的主要内容区域。目前,如果点击主要内容区域,抽屉将关闭然后触摸事件将被丢弃,我想捕捉该触摸事件并将其传递给主要内容区域。
问问题
2508 次
2 回答
5
您需要创建自定义 DrawerLayout 和 @overide onInterceptTouchEvent
。然后,您可以创建一些方法来注册抽屉视图(如setDrawerViewWithoutIntercepting
),当它们打开时,可以使用(单击)主要内容。你应该在你的活动/片段中调用这个方法,这个 DrawerLayout 在哪里使用。
OnInterceptTouchEvent 将返回 false 以防已注册的抽屉视图打开并且触摸位于抽屉视图区域之外。这意味着所有功能都保持不变(例如使用滑动关闭抽屉视图等)
这只是一个应该改进的例子,所以我希望它会对你有所帮助。
private View currentDrawerView;
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean result = super.onInterceptTouchEvent(event);
if (currentDrawerView != null && isDrawerOpen(currentDrawerView)) {
DrawerLayout.LayoutParams layoutParams = (DrawerLayout.LayoutParams) currentDrawerView.getLayoutParams();
if (layoutParams.gravity == Gravity.RIGHT) {
if (event.getX() < currentDrawerView.getX()) {
result = false;
}
}
else if (layoutParams.gravity == Gravity.LEFT) {
if (event.getX() > currentDrawerView.getX() + currentDrawerView.getWidth()) {
result = false;
}
}
// ......
};
return result;
}
public void setDrawerViewWithoutIntercepting(View view) {
this.currentDrawerView = view;
}
于 2013-09-12T06:39:31.980 回答
4
我用临时解决方案解决了我的问题,不是那么优雅,但做了一段时间的工作,可能包含副作用。我总是返回false
onInterceptTouchEvent() 调用,并且每次都处于活动状态。
public class CustomDrawerLayout extends DrawerLayout {
public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomDrawerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomDrawerLayout(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// always false and event will be send to each view
return false;
}
}
于 2013-09-12T05:31:25.983 回答