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

2024-05-15

背景

近几个月来,谷歌发布了Youtube 应用程序 http://www.androidpolice.com/2013/08/19/breaking-massive-youtube-for-android-v5-0-update-brings-brand-new-ui-in-app-multitasking-and-much-more/带有导航抽屉(又名滑动菜单)。

它有许多很酷的功能,我希望在我正在开发的应用程序上拥有这些功能。

特点是:

  1. 触摸任意位置即可开始滑动。

  2. 切换模式时移动操作栏“向上”按钮上的图标。

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

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

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

以下是显示我在说什么的屏幕截图:

滑动前:

滑动后:

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

  • 官方谷歌导航抽屉库 http://developer.android.com/training/implementing-navigation/nav-drawer.html .

  • the 滑动菜单库,作者:jfeinstein10 https://github.com/jfeinstein10/SlidingMenu .

问题

官方库和滑动菜单库都没有像 YouTube 应用程序那样将所有这些功能组合在一起。

例如,官方图书馆没有能力#1(这就是为什么我发布了这个线程 https://stackoverflow.com/questions/17699869/how-to-show-the-drawerlayout-when-sliding-from-left-to-right-no-matter-where) ,所以我使用了 movingMenu 库。

然而,slidingMenu 库没有(或者是吗?)能力 #2 和 #3 。

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

我尝试过什么

目前,我使用滑动菜单库,所以这是我准备滑动菜单的代码:

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

question

我怎样才能让滑动菜单(或导航抽屉)像在 youtube 应用程序上一样工作,这意味着我提到的所有功能相结合?


可能的解决方案

编辑:使用菜单抽屉库 http://simonvt.github.io/android-menudrawer/(github 链接here https://github.com/SimonVT/android-menudrawer),我已经成功实现了我提到的所有功能。这是一个示例代码:

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

用这个菜单抽屉 http://simonvt.github.io/android-menudrawer/

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

特征:

  • 菜单可以沿着所有四个边缘定位。
  • 支持附加始终可见、不可拖动的菜单,这在平板电脑上很有用。
  • 菜单可以包裹内容和整个窗口。
  • 允许通过拖动边缘、整个屏幕或根本不打开抽屉。
  • 可用于 XML 布局。
  • 显示当前可见的屏幕的指示器
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模仿 youtube/gmail 应用程序的导航抽屉 的相关文章

随机推荐

  • 如何轻松地将 Ajax、perl 和 JSON 结合使用?

    我正在尝试使用 Ajax 制作一个网页 Example 我创建了一个 Perl CGU 文件来触发一个简单的帖子 文件 test cgi name 托马斯 回复短信 你的名字是托马斯 我创建了一个可以使用该帖子的 html 文件 但随后页面
  • 我们如何从 Android 通知中提取 bigpicturestyle 图像?

    我有一个通知侦听器服务 可以读取来自其他应用程序的通知 经用户许可 并提取所有数据 能够访问除通知展开视图中显示的图像之外的所有内容 我也在阅读 EXTRA PICTURE 意图值 if extras containsKey Notific
  • 如果函数来自外部 JavaScript 库,如何处理 JavaScript 中冲突的函数名称?

    我有两个外部 JavaScript lib 文件 我必须加载到同一个文件上JSP http en wikipedia org wiki JavaServer Pages页 它们都有一个名为 autoSave 的函数 两者都没有参数 我无法修
  • 使用 vim pythoncomplete 的 Python 文档字符串不显示我自己的类函数的换行符

    我在尝试使用时得到了一些意想不到的结果Python 全方位补全 http www vim org scripts script php script id 1542在我自己的类函数上 函数的文档字符串未正确设置换行符格式 如下图所示 当我从
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • 正则表达式匹配带有连字符和/或撇号的单词

    我正在寻找一个正则表达式来匹配带有连字符和 或撇号的单词 到目前为止 我有 w w w 这在大多数情况下都有效 但如果先有一个撇号 然后有一个连字符 例如 qu est ce 则它不匹配 我可以附加更多选项 尽管也许还有另一种更有效的方法
  • 可能的 std::async 实现错误 Windows

    看来 std async 的 Windows 实现存在错误 在重负载下 大约每秒启动 1000 个异步线程 异步任务永远不会被调度 并且等待返回的 future 会导致死锁 请参阅这段代码 使用延迟启动策略而不是异步进行修改 Bundlin
  • c# - 如何列出硬盘上的所有文件和文件夹?

    我想列出我的程序有权访问的所有文件和文件夹并将它们写入文本文件 我如何获得该列表 我需要一种方法来捕获或不对不可访问的文件夹抛出 UnauthorizedAccessExceptions 请尝试使用代码 private static IEn
  • EF6 Code First 支持表值函数吗?

    是否可以在 EF6 Code First 中调用 TVF 我首先使用 EF6 数据库启动了一个新项目 EF 能够将 TVF 导入到模型中并调用它就好了 但是 对于我一直在处理的没有 RI 的大型只读数据库 更新模型变得非常耗时并且存在问题
  • React 组件等待所需的 props 渲染

    我正在父组件内部声明一个组件 我想在一个文件中建立特定的道具 然后在父组件中 我希望能够同时为子组件建立其他道具 因为它们是共享属性 在大多数情况下 我的问题是 子组件尝试渲染并失败 因为首先没有建立所需的道具类型 有没有办法告诉子组件等待
  • 如何使用 kotlin Android 从 Url 读取 JSON?

    我正在使用 kotlin 来开发应用程序 现在我想从服务器获取 JSON 数据 在java中 我实现了Asyntask以及Rxjava来从Url读取JSON 我也在谷歌搜索 但我无法获得满足我的要求的正确详细信息 如何使用 kotlin 从
  • 使用 Google 云端硬盘缩略图的正确方法是什么?

    我首先尝试存储和使用 API 返回的链接 但它会在短时间内过期 然后我尝试在本地下载并存储图像 并从我的服务器提供它 但是当我没有使用我的帐户登录时 缩略图链接会抛出 404 错误 尽管文档是完全公开的 提供 检索文档缩略图的正确方法是什么
  • KMeans 对不平衡数据进行聚类

    我有一组包含 50 个特征 c1 c2 c3 的数据 行数超过 80k 每行包含标准化数值 范围 0 1 它实际上是一个标准化的虚拟变量 其中一些行只有很少的特征 3 4 即如果没有值则分配 0 大多数行大约有 10 20 个特征 我使用
  • 创建 HTML 元素并向其附加属性,然后将其包装在另一个元素内的最有效方法是什么?

    I found 这个答案 https stackoverflow com a 5674985 538786 这太棒了 但是如果我还必须在该元素周围包裹另一个元素怎么办 这就是我现在正在做的 screenshots append a href
  • 为什么 C# 处理命令行参数的方式不一致?

    在 C 中 直接从 Main 获取命令行参数会省略 exe 名称 这与 C 的传统相反 通过 Environment GetCommandLineArgs 获取相同的命令行参数包括它 对于这种明显的不一致 我是否缺少一些合理的逻辑原因 cl
  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 使用空大括号初始值设定项重载解析:指针还是引用? [复制]

    这个问题在这里已经有答案了 当我发现下面的代码输出 指针 时 我遇到了现实生活中的WTF时刻 include
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 模仿 youtube/gmail 应用程序的导航抽屉

    背景 近几个月来 谷歌发布了Youtube 应用程序 http www androidpolice com 2013 08 19 breaking massive youtube for android v5 0 update brings