解决DrawerLayout只能从边缘滑动的问题

方法一 (利用反射)

 写个工具类

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会导致侧边栏的滑出

第二种方法,没有了菜单滑出的跟随效果,只有一整个滑动事件完成(即手松开,或者横向滑动速度大于纵向滑动速度时)菜单才会滑出,不会滑动一点菜单出现一点。


猜你喜欢

转载自blog.csdn.net/lyc088456/article/details/80141926