13

DrawerLayout のデフォルトの感度は問題ありませんが、画面の横で左から右へのスライド ジェスチャを実行して drawerlayout を開く操作をもう少し簡単にしたいと考えています。タブレットでは特に難しいと思いますが、一部の電話でもそうです。

Web API の DrawerLayout ページにジェスチャまたはジェスチャ コントローラの参照が表示されません。これを可能にする何かを見た人はいますか?

4

2 に答える 2

5

というのは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のインスタンスに依存してドラッグを処理するという事実に基づいています。2 つのインスタンスがあります。1 つは左の引き出し用で、もう 1 つは右の引き出し用です。それらは次のようにインスタンス化されています。

 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フィールド inViewDragHelperも非公開です。クライアント コードでこれらのフィールドを設定できるようにするパブリック メソッドはありません。したがって、ハックはリフレクションに依存しています。これは、ViewDragHelper および DrawerLayout クラスの内部実装の変更に対して脆弱です。

おまけ:
ViewDragHelper の使用に関する包括的なチュートリアル

于 2016-03-22T14:52:04.247 に答える