方法一 (利用反射)
写个工具类
public class DrawerLeftEdgeSize { public static void setLeftEdgeSize (Activity activity, DrawerLayout drawerLayout, float displayWidthPercentage) { if (activity == null || drawerLayout == null) {return;} try { // 找到 ViewDragHelper 并设置 Accessible 为true Field leftDraggerField = drawerLayout.getClass().getDeclaredField("mLeftDragger");//Right leftDraggerField.setAccessible(true); ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(drawerLayout); // 找到 edgeSizeField 并设置 Accessible 为true Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize"); edgeSizeField.setAccessible(true); int edgeSize = edgeSizeField.getInt(leftDragger); // 设置新的边缘大小 Point displaySize = new Point(); activity.getWindowManager().getDefaultDisplay().getSize(displaySize); edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) (displaySize.x * displayWidthPercentage))); } catch (NoSuchFieldException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } } }
在Activity调用
DrawerLeftEdgeSize.setLeftEdgeSize(this,drawer,0.4f);
方法二:通过拦截Activity触摸事件的分发,实现全屏滑出菜单
GestureDetector gestureDetector;
gestureDetector=new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float offsetX=e2.getX()-e1.getX(); float offsetY=e2.getY()-e1.getY(); if ((offsetX > 0 && offsetX > Math.abs(offsetY) && Math.abs(offsetY)<=50) || (velocityX > 0 && velocityX > Math.abs(velocityY) && Math.abs(offsetY)<=50)) { return true; } return false; }});
@Override public boolean dispatchTouchEvent(MotionEvent event){ //当向右滑动的时候,拦截事件,不传下去,通过GestureDetector辅助事件的判断 if(gestureDetector.onTouchEvent(event)){ //打开侧边栏 drawer.openDrawer(GravityCompat.START); return true; } return super.dispatchTouchEvent(event); }
这两种方法都有各自的问题。
第一种方法,反射修改DrawerLayout的mEdgeSize参数,在DrawerLayout中嵌入ListView时,长按ListView的item会导致侧边栏的滑出
第二种方法,没有了菜单滑出的跟随效果,只有一整个滑动事件完成(即手松开,或者横向滑动速度大于纵向滑动速度时)菜单才会滑出,不会滑动一点菜单出现一点。