2013-07-30 2 views
12

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

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

ответ

-1

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

0

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

реализация Hack:

// 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.

Бонус:
A comprehensive tutorial on ViewDragHelper usage

Смежные вопросы