drawerLayout是官方的侧滑控件,简单方便。但是我们会发现drawerLayout滑动显示的时候手指一定要贴到屏幕最边上然后滑动才可以把隐藏的菜单给拉出来。drawerLayout也没有提供给我们一个方法来修改滑动边距。查看drawerLayout源码可以发现,在DrawerLayout中有两个ViewDragHelper对象:mLeftDragger,mRightDragger;这个类中有一个int类型的mEdgeSize变量,就是用来控制滑动边距的。所以我们只需要修改mEdgeSize的值就可以改变drawerLayout的滑动边距。
由于变量都是私有的,所以我们只能通过反射来修改变量值:
首先获取mLeftDragger对象:
Field field = drawerLayout.getClass().getDeclaredField("mLeftDragger");
field.setAccessible(true);
ViewDragHelper mLeftDragger = (ViewDragHelper) field.get(drawerLayout);
得到mLeftDragger对象后我们获取并修改mEdgeSize变量的值:
Field field1 = mLeftDragger.getClass().getDeclaredField("mEdgeSize");
field1.setAccessible(true);
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
field1.setInt(mLeftDragger, (int) (metrics.widthPixels*0.2));
这里我们修改滑动边距为屏幕宽度的百分之20.
静态方法:
/**
* 设置drawerLayout滑动边距
* @param drawerLayout
* @param activity
* @param proportion
*/
public static void setDrawerRightEdgeSize(DrawerLayout drawerLayout,Activity activity,float proportion){
if(drawerLayout==null||activity==null){
return;
}
try {
Field field = drawerLayout.getClass().getDeclaredField("mLeftDragger");
field.setAccessible(true);
ViewDragHelper mLeftDragger = (ViewDragHelper) field.get(drawerLayout);
Field field1 = mLeftDragger.getClass().getDeclaredField("mEdgeSize");
field1.setAccessible(true);
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
field1.setInt(mLeftDragger, (int) (metrics.widthPixels*proportion));
} catch (Exception e) {
e.printStackTrace();
}
}