1

SlidingDrawer ViewGroup を利用しようとしていますが、いくつかの障害に遭遇しました。SlidingDrawer にアタッチできるリスナーがいくつかあります。

OnDrawerScrollListener
OnDrawerOpenListener
OnDrawerCloseListener

onScrollStarted() は、SlidingDrawer ハンドルが最初にプルされるときに呼び出されます。

onScrollEnded() は、ユーザーがハンドル上で指の追跡を停止したときに呼び出されます (驚くべきことに、アニメーションが終了した後ではありません)。

onDrawerOpened() は、ユーザーが指を離し、引き出しがアニメーションで完全に開いたときにのみ呼び出されます。

onDrawerClosed() は、ユーザーが指を離し、引き出しがアニメーションで完全に閉じたときにのみ呼び出されます。

ドロワーが開き始めた瞬間にアクティビティのメイン ビューを無効にしたい (これは onScrollStarted() で実行できます)。引き出しが閉じているときに、アクティビティのメイン ビューを有効にしたいと考えています。ユーザーが引き出しを半分開いた状態でドラッグし、(指を離さずに) 引き出しを完全に閉じた場合、onDrawerClosed() が呼び出されないため、メイン ビューを再度有効にするかどうかを判断する方法がわかりません。onScrollEnded() でメイン ビューを有効にすることはできません。そのメソッドは、引き出しが完全に開いたり完全に閉じたりする直前に呼び出されるためです。

私が言及した 3 つのリスナー内の呼び出しの順序は次のとおりです。

onScrollStarted() onScrollEnded() onDrawerOpened() / onDrawerClosed()

明らかに、onScroll メソッドでは、タッチ イベントをリッスンしない限り、ドロワーが「開いている」か「閉じている」かを判断する方法がありません。それほど面倒にならずにこれを行う方法はありますか?

ありがとう。

編集:これが私のコードスニペットです。

private boolean mDrawerScrolling = false;

    @Override
    public void onDrawerOpened() {
        Log.d(TAG, "onDrawerOpened");
    }

    @Override
    public void onDrawerClosed() {
        mViewPager.setScrollEnabled(true);

        Log.d(TAG, "onDrawerClosed");

        final View view = (View) mDrawer.getTag();
        if (view != null) {
            final Animator fadeInAnimation = AnimatorInflater.loadAnimator(
                    InboxActivity.this, R.animator.fade_out);
            fadeInAnimation.setTarget(view);
            fadeInAnimation.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationEnd(Animator animation) {
                    removeView();
                }

                @Override
                public void onAnimationCancel(Animator animation) {
                    removeView();
                }

                private void removeView() {
                    ViewGroup container = (ViewGroup) findViewById(R.id.container);

                    container.removeView(view);
                }

            });
            fadeInAnimation.start();

            mDrawer.setTag(null);
        }
    }

    @Override
    public void onScrollEnded() {
        mDrawerScrolling = false;

        int left = mDrawer.getHandle().getLeft();

        Log.d(TAG, "onScrollEnded() " + left);
    }

    @Override
    public void onScrollStarted() {
        mDrawerScrolling = true;
        mCanHide = false;

        Log.d(TAG, "onScrollStarted");

        /*
         * Open the drawer if it is not open yet.
         */
        if (mDrawer.getTag() == null) {
            final View dimView = getLayoutInflater().inflate(
                    R.layout.drawer_outer, null);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);
            dimView.setLayoutParams(params);
            dimView.setOnTouchListener(this);

            final ViewGroup container = (ViewGroup) findViewById(R.id.container);
            container.addView(dimView);
            container.bringChildToFront(mDrawer);

            final Animator fadeInAnimation = AnimatorInflater.loadAnimator(
                    InboxActivity.this, R.animator.fade_in);
            fadeInAnimation.setTarget(dimView);
            fadeInAnimation.start();

            mDrawer.setTag(dimView);
        }
    }
4

2 に答える 2

3

私は以前に同様の問題を抱えていて、setOnDrawerScrollListener(), isMoving(), isOpened(), Runnable(), Handler(), and Thread()クラスを使用する簡単なソリューションを作成することができました。以下に解決策とコメントを投稿しました。

    mSlidingDrawer.setOnDrawerScrollListener(new OnDrawerScrollListener() {

        private Runnable mRunnable = new Runnable() {

            @Override
            public void run() {
                // While the SlidingDrawer is moving; do nothing.
                while (mSlidingDrawer.isMoving())
                {
                    // Allow another thread to process its instructions.
                    Thread.yield();
                }

                // When the SlidingDrawer is no longer moving; trigger mHandler.
                mHandler.sendEmptyMessage(0);
            }
        };

        private Handler mHandler = new Handler() {

            public void handleMessage(Message msg) {

                if (mSlidingDrawer.isOpened()) {
                    // TODO: Case 1 - If the SlidingDrawer is completely opened...
                }
                else {
                    // TODO: Case 2 - If the SlidingDrawer is completely closed...
                }
            }
        };

        @Override
        public void onScrollEnded() {
            new Thread(mRunnable).start();
        }

        @Override
        public void onScrollStarted() {
            // TODO: When the user beings to scroll the SlidingDrawer...
        }
    });

注:mSlidingDrawer参照を、これらの命令を実行する SlidingDrawer への参照に置き換えます。

于 2012-08-23T22:35:16.863 に答える