Как открыть Navigation Drawer свайпом с середины экрана?

у меня на всю activity стоит recyclerview, я хочу открывать navigation drawer свайпом с центра экрана, как в телеграмме например. Я пробовал через рефлексии, но таким методом перебивается longclicklistener в левой части экрана на элементах recyclerview, пробовал через кастомный touchlistener, но его некуда ставить, на recyclerview не работает, а если ставить на каждый элемент, это работает некорректною


Ответы (1 шт):

Автор решения: W4ereT1ckRtB1tch

Если navigation drawer не из шаблона, а сделан самостоятельно, то я нашел вот такое решение, у меня оно отлично работает и устраивает.

drawer = findViewById(R.id.drawer_layout);
        navigationView = findViewById(R.id.nav_view);
        mainNavMenu = navigationView.getMenu();

        //обертывает шаблон меню в боковое меню
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
       
 //изменение область захвата шторки тут - НАЧАЛО
        try {
            Field mDragger = drawer.getClass().getDeclaredField("mLeftDragger");
            mDragger.setAccessible(true);
            ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(drawer);
            Field mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize");
            mEdgeSize.setAccessible(true);
            int edge = mEdgeSize.getInt(draggerObj);

            mEdgeSize.setInt(draggerObj, (edge * 4));
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        } //КОНЕЦ

        //открываю меню при старте чтобы показать что оно есть
        drawer.openDrawer(GravityCompat.START);

Значение edge - это и есть область захвата, можно указать фиксировано в dp. Или как сделал я добавил множитель - оптимальный для себя 4, чтобы учитывать размер экрана устройства. Можно высчитать размер экрана и находить середину , передавая это значение edge. Я новичок и этот небольшой кусок кода вполне понятен для меня и работает.

→ Ссылка