1

NavigationDrawerいくつかのフィルターを表示するために右からスライドを使用しています。問題は、右側の引き出しがフリング ジェスチャを行うときだけ開いたままになることです。重力属性をstartまたはに変更するleftと、通常は開いたままになります。ゆっくりドラッグして離すと引き出しが開いたままになるのが普通だと思います。右側に引出しがあり、閉じた位置に偏りがあるようです。

私は何か間違ったことをしていますか?正常にスライドさせる方法はありますか?私のユーザーは、引き出しを開いたままにしておくために投げる必要があることを理解するのに苦労しています.

サポート ライブラリの使用。

フリングが必要:

<LinearLayout
    android:id="@+id/filtersDrawer"
    android:layout_width="200dp"
    android:layout_height="fill_parent"
    android:layout_gravity="end"
    android:background="@color/drawer_color"
    android:orientation="vertical" >

フリングは必要ありません:

<LinearLayout
    android:id="@+id/filtersDrawer"
    android:layout_width="200dp"
    android:layout_height="fill_parent"
    android:layout_gravity="start"
    android:background="@color/drawer_color"
    android:orientation="vertical" >

ありがとう!

4

2 に答える 2

2

ストック実装の欠陥に対処するための正しいロジックを思いついたような気がします。

drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
    /**
     * percentage of its width that the drawer needs to be open to
     * trigger a toggle (between 0 and 1).
     **/
    private static final float TOGGLE_OFFSET = 0.3f;

    private float lastSlideOffset;
    private boolean isDragging;

    @Override
    public void onDrawerSlide(View view, float slideOffset) {
        lastSlideOffset = slideOffset;
    }

    @Override
    public void onDrawerOpened(View view) {}

    @Override
    public void onDrawerClosed(View view) {}

    @Override
    public void onDrawerStateChanged(int newState) {
        switch (newState) {
            case DrawerLayout.STATE_DRAGGING:
                isDragging = true;
                break;

            case DrawerLayout.STATE_IDLE:
                isDragging = false;
                break;

            case DrawerLayout.STATE_SETTLING:
                if (isDragging) {
                    attemptToggle();
                }
                break;
        }
    }

    private void attemptToggle() {
        if (drawerLayout.isDrawerOpen(Gravity.END)) {
            if (lastSlideOffset <= 1 - TOGGLE_OFFSET) {
                drawerLayout.closeDrawer(Gravity.END);
            } else {
                drawerLayout.openDrawer(Gravity.END);
            }

        } else {
            if (lastSlideOffset >= TOGGLE_OFFSET) {
                drawerLayout.openDrawer(Gravity.END);
            } else {
                drawerLayout.closeDrawer(Gravity.END);
            }
        }
    }
});
于 2013-10-31T06:47:18.203 に答える
1

この問題を解決するには、リスナーを使用し、ユーザーが一定の割合をドラッグしたときにドロワーを強制的に開閉してから、次のようにドロワーを解放します。

    mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        private float mLastOffset;
        @Override
        public void onDrawerSlide(View view, float slideOffset) {
            mLastOffset = slideOffset;
        }

        @Override
        public void onDrawerOpened(View view) {

        }

        @Override
        public void onDrawerClosed(View view) {

        }

        @Override
        public void onDrawerStateChanged(int newState) {
            if (newState == DrawerLayout.STATE_SETTLING) {
                if (mLastOffset > 0.5f) {
                    mDrawerLayout.openDrawer(Gravity.END);
                } else {
                    mDrawerLayout.closeDrawer(Gravity.END);
                }
            }
        }
    });
于 2013-09-02T23:44:17.897 に答える