Как открыть Navigation Drawer свайпом с середины экрана?
у меня на всю activity стоит recyclerview, я хочу открывать navigation drawer свайпом с центра экрана, как в телеграмме например. Я пробовал через рефлексии, но таким методом перебивается longclicklistener в левой части экрана на элементах recyclerview, пробовал через кастомный touchlistener, но его некуда ставить, на recyclerview не работает, а если ставить на каждый элемент, это работает некорректною
Ответы (1 шт):
Если 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. Я новичок и этот небольшой кусок кода вполне понятен для меня и работает.