DrawerLayout изменить чувствительность?

Чувствительность по умолчанию DrawerLayout в порядке, но мне хотелось бы сделать немного легче сделать сдвиг слева направо на боковой стороне экрана, чтобы открыть drawerlayout. Я считаю, что это сложно для планшетов, но также и на некоторых телефонах.

Я не вижу ссылок на жестов или жестов на странице DrawerLayout веб-API. Кто-нибудь видел что-то, что позволит нам это сделать?

Ответ 1

Простой пример жестов: вы можете попытаться наложить на верхний экран 2 изображения с кругом, а когда вы нажмете на него, чтобы перейти на другой слой, и снова вы нажали предыдущий круг, чтобы снова прыгнуть. Попробуйте перейти от одного действия к другому, и если вы хотите закрыть предыдущую операцию, после того, как вы вызвали следующую операцию, просто закройте предыдущую с помощью .finish();

Ответ 2

Для android.support.v4.widget.DrawerLayout Я придумал хак, который позволяет вам расширить область, где может начинаться скольжение (ход), что облегчает передвижение.

Выполнение взлома:

    // assuming mDrawerLayout is an instance of android.support.v4.widget.DrawerLayout
    try {

        // get dragger responsible for the dragging of the left drawer
        Field draggerField = DrawerLayout.class.getDeclaredField("mLeftDragger");
        draggerField.setAccessible(true);
        ViewDragHelper vdh = (ViewDragHelper)draggerField.get(mDrawerLayout);

        // get access to the private field which defines
        // how far from the edge dragging can start
        Field edgeSizeField = ViewDragHelper.class.getDeclaredField("mEdgeSize");
        edgeSizeField.setAccessible(true);

        // increase the edge size - while x2 should be good enough,
        // try bigger values to easily see the difference
        int origEdgeSize = (int)edgeSizeField.get(vdh);
        int newEdgeSize = (int) (origEdgeSize * 2); 
        edgeSizeField.setInt(vdh, newEdgeSize);

    } catch (Exception e) {
        // we unexpectedly failed - e.g. if internal implementation of 
        // either ViewDragHelper or DrawerLayout changed
    }

Объяснение:

Взлом основан на том, что класс DrawerLayout использует экземпляры ViewDragHelper для обработки перетаскивания. Есть два экземпляра - один для левого ящика, а один для правильного. Они получают экземпляр следующим образом:

 public DrawerLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    ... code omitted for brevity ..

    mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback);
    mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
    mLeftDragger.setMinVelocity(minVel);
    mLeftCallback.setDragger(mLeftDragger);

    mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback);
    mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
    mRightDragger.setMinVelocity(minVel);
    mRightCallback.setDragger(mRightDragger);

    ... code omitted for brevity ..
}

Оба mLeftDragger и mRightDragger являются частными полями, а поле mFieldSize в ViewDragHelper также является закрытым. Нет общедоступных методов, которые позволяли бы клиентскому коду устанавливать эти поля, поэтому хак полагается на отражение, которое является хрупким по отношению к внутренним изменениям реализации в классах ViewDragHelper и DrawerLayout.

Bonus:
Полный учебник по использованию ViewDragHelper