android - SlidingDrawer 确定抽屉在完全打开之前是否被拉出并推回

标签 android slidingdrawer

我正在尝试使用 SlidingDrawer ViewGroup,但遇到了一些障碍。我们可以将一些监听器附加到 SlidingDrawer:

OnDrawerScrollListener
OnDrawerOpenListener
OnDrawerCloseListener

onScrollStarted() 在最初拉动 SlidingDrawer 句柄时调用。

onScrollEnded() 在用户停止在 handle 上追踪他们的手指时调用(令人惊讶的是在动画结束后不会)。

onDrawerOpened() 仅在用户抬起手指且抽屉动画完全打开时调用。

onDrawerClosed() 仅在用户抬起手指且抽屉动画完全关闭时调用。

我想在抽屉开始打开时禁用 Activity 的主视图(这可以通过 onScrollStarted() 完成)。当抽屉关闭时,我想启用我的 Activity 的主视图。如果用户将抽屉拖到一半打开然后(没有抬起手指)将抽屉再次完全关闭,那么我不知道如何确定是否再次启用主视图,因为没有调用 onDrawerClosed() 。我不能只在 onScrollEnded() 中启用主视图,因为该方法是在抽屉完全打开或完全关闭之前调用的。

我提到的 3 个监听器中的调用顺序是:

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

很明显,在 onScroll 方法中,除非我监听触摸事件,否则无法确定抽屉是“打开”还是“关闭”。有什么方法可以让我做到这一点而不会那么困惑吗?

谢谢。

编辑:这是我的代码 fragment 。

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);
        }
    }

最佳答案

前段时间我遇到了类似的问题,并设法创建了一个简单的解决方案,它使用 setOnDrawerScrollListener()、isMoving()、isOpened()、Runnable()、Handler() 和 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 的引用。

关于android - SlidingDrawer 确定抽屉在完全打开之前是否被拉出并推回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916348/

相关文章:

Android Flickr Json 缓存图像

java - 菜单按钮可用,软按钮不起作用。基本上相同的代码

具有正确 layout_gravity 的 Android Horizo​​ntalScrollView 工作错误

android - 在应用程序中显示 Google 日历

安卓 : Getting uri for installed Applications

android - DrawerLayout.openDrawer 有时不工作

android - 不推荐使用 SlidingDrawer

Android滑动 fragment 而不是菜单

android - LinearLayout@422725b0 不是滑动抽屉

jquery - 如何在 jQuery Mobile 上实现 ResideMenu?