模仿youtube/gmail应用程序的导航抽屉

and*_*per 10 android actionbarsherlock android-actionbar slidingmenu navigation-drawer

背景

最近几个月,Google发布了带导航抽屉的Youtube应用程序(AKA滑动菜单).

它有许多很酷的功能,我希望在我正在使用的应用程序上.

功能是:

  1. 触摸任何地方开始滑动.

  2. 切换模式时,在操作栏的"向上"按钮上移动图标.

  3. 滑动菜单时,内容区域(右侧区域,而不是菜单本身)保持而不是滚动.

  4. 操作栏保持而不是滚动.

  5. 内容区域(右侧区域,而不是菜单本身)在滚动时更改其颜色,而不是菜单本身.

这里是截图,以显示我在说什么:

滑动之前:

之前

滑动后:

后

目前,我知道有两个主要的图书馆负责使用导航抽屉:

问题

官方库和slidingMenu库都没有像youtube应用程序那样组合所有这些功能.

例如,官方图书馆没有能力#1(这就是我发布这个帖子的原因),所以我使用了slidingMenu库.

但是,slidingMenu库没有(或者它是)能力#2和#3.

两个库都没有足够的文档/示例可以做什么,因此很难使用它们或为它们添加新功能.

我试过的

目前,我使用的是slidingMenu库,所以这是我准备slideMenu的代码:

activity.setBehindContentView(slidingMenuRootView);
mSlidingMenu = activity.getSlidingMenu();
mSlidingMenu.setShadowWidthRes(R.dimen.slidingmenu_shadow_width);
mSlidingMenu.setShadowDrawable(R.drawable.slidingmenu_shadow);
mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
mSlidingMenu.setFadeEnabled(true);
mSlidingMenu.setFadeDegree(1.0f);
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
activity.setSlidingActionBarEnabled(false);
Run Code Online (Sandbox Code Playgroud)

我如何让slideMenu(或导航抽屉)在youtube应用程序上运行,这意味着我提到的所有功能组合在一起?


可能解决方案

编辑:使用menuDrawer库(这里是 github链接),我已经成功实现了我提到的所有功能.这是一个示例代码:

public class ActionBarSherlockSample extends SherlockActivity {

    private MenuDrawer mDrawer;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar();
        mDrawer = MenuDrawer.attach(this, MenuDrawer.Type.OVERLAY);
        final TextView menuView = new TextView(this);
        menuView.setTextColor(0xFFFFFFFF);
        menuView.setText("As the drawer opens, the drawer indicator icon becomes smaller.");
        menuView.setGravity(Gravity.CENTER);
        mDrawer.setMenuView(menuView);
        mDrawer.setTouchMode(MenuDrawer.TOUCH_MODE_FULLSCREEN);
        mDrawer.setOnDrawerStateChangeListener(new OnDrawerStateChangeListener() {

            @Override
            public void onDrawerStateChange(final int oldState, final int newState) {
                Log.d("AppLog", "oldState:" + oldState + " newState:" + newState);
            }

            @Override
            public void onDrawerSlide(final float openRatio, final int offsetPixels) {
            }
        });
        final TextView contentView = new TextView(this);
        contentView
                .setText("This sample uses ActionBarSherlock to display an ActionBar on older platforms. The drawer indicator, "
                        + "as per the design guidelines, is visible in the top left corner.");
        contentView.setGravity(Gravity.CENTER);
        mDrawer.setContentView(contentView);
        mDrawer.setSlideDrawable(R.drawable.ic_drawer);
        mDrawer.setDrawerIndicatorEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            mDrawer.toggleMenu();
            break;
        }
        return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

fid*_*989 1

使用这个菜单抽屉

滑出式菜单实现,允许用户在应用程序的视图之间导航。

特征:

  • 菜单可以沿着所有四个边缘定位。
  • 支持附加始终可见、不可拖动的菜单,这在平板电脑上很有用。
  • 菜单可以包裹内容和整个窗口。
  • 允许通过拖动边缘、整个屏幕或根本不打开抽屉。
  • 可用于 XML 布局。
  • 显示当前可见的屏幕的指示器