【问题标题】:Touch anywhere to slide open menu for navigation drawer触摸任意位置以滑动导航抽屉的打开菜单
【发布时间】:2013-05-16 09:13:22
【问题描述】:

对于 jfeinstein10 (https://github.com/jfeinstein10/SlidingMenu) 的滑动菜单,我可以在应用程序中的任意位置滑动以滑动打开菜单。

对于谷歌新推出的导航抽屉http://developer.android.com/design/patterns/navigation-drawer.html#side-nav,有什么办法可以让我有类似的行为吗?

到目前为止,从文档中,我看到它仅限于从边缘滑动或触摸应用程序图标。

用户可以通过滑动将导航抽屉带到屏幕上 从屏幕的左边缘或通过触摸应用程序图标 在操作栏上。

【问题讨论】:

标签: android navigation-drawer


【解决方案1】:

我找到了解决办法。您可以配置触摸边距并使其与您的视图一样宽。这是链接

Set drag margin for Android Navigation Drawer

【讨论】:

  • hack 并没有真正起作用,尤其是当它的内容是 ViewPager 时。当使用 NavigationDrawer 向左滑动时,ViewPager 不会从视图 0 更改为视图 1。所有事件都由 NavigationDrawer 消耗。
【解决方案2】:

Google,从他们的教程“如果用户触摸屏幕的最左边缘(距左侧 20 dp 之内)”的措辞来看,似乎他们不想要该功能。

http://developer.android.com/design/patterns/navigation-drawer.html

“用户可以通过从屏幕左边缘滑动或触摸操作栏上的应用程序图标将导航抽屉带到屏幕上。”

他们不会说或从屏幕上的任何位置滑动。他们的任何应用程序(G+、Gmail 等)也没有该功能,因此如果您想要该功能,您可能应该坚持自己编写(使用手势)或第三方(例如 jfeinstein10)。

编辑: Youtube 应用确实可以让你在任何地方滑动,但我至少拥有的版本 (4.5.17) 看起来不像使用他们的新 api。

【讨论】:

  • 这个。既然有官方的设计模式,最好按照它来。用户将习惯于官方处理抽屉导航的方式,并期望所有应用都遵循它。
【解决方案3】:

你可以用这个

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Field mDragger = mDrawerLayout.getClass().getDeclaredField(
    "mLeftDragger");//mRightDragger or mLeftDragger based on Drawer Gravity
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger
    .get(mDrawerLayout);

Field mEdgeSize = draggerObj.getClass().getDeclaredField(
    "mEdgeSize");
mEdgeSize.setAccessible(true);
int edge = mEdgeSize.getInt(draggerObj);

mEdgeSize.setInt(draggerObj, edge * 3); 

【讨论】:

    【解决方案4】:

    正如其他人所说,切尼在他的回答中也说过 - 最好按预期保留它。但是,DrawerLayoutSlidingMenu 的风格不同。谷歌还添加了SlidingPaneLayout,更贴合SlidingMenu的风格。

    我最终以这种方式实现了SlidingPaneLayout,因为它毕竟是我想要的。 (这也是 YouTube/Hangouts 应用的风格)

    <android.support.v4.widget.SlidingPaneLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/sliding_pane_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
                android:id="@+id/left_pane"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
    
    </android.support.v4.widget.SlidingPaneLayout>
    

    然后用action bar home键打开:

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action buttons
        switch(item.getItemId()) {
            case android.R.id.home:
                if (mPaneLayout.isOpen())
                    mPaneLayout.closePane();
                else
                    mPaneLayout.openPane();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    然后你可以实现一个PanelSlideListener 来处理它的滑动/打开/关闭。

    我建议也阅读 Adam Powell 关于导航抽屉的系列文章 - 第 3 部分介绍 SlidingPaneLayout 与导航抽屉的使用:

    第 1 部分 - https://plus.google.com/+AdamWPowell/posts/2zi4DXd3jkm

    第 2 部分 - https://plus.google.com/+AdamWPowell/posts/VdgexsZeXHW

    第 3 部分 - https://plus.google.com/+AdamWPowell/posts/8j2GVw72i1E

    第 4 部分 - https://plus.google.com/+AdamWPowell/posts/TtBFUXhe5HU

    【讨论】:

      【解决方案5】:

      您可以使用GestureDetector 自己检测滑动手势,然后使用DrawerLayout.openDrawer() 方法自己打开导航抽屉。

      【讨论】:

      • 是的,我想过这个,但这并不理想。它不会随着您的手指逐渐拖动,而是会立即打开抽屉。理想情况下希望与默认行为相同(否则我可能会选择类似 SlidingMenu 实现)
      • 随着谷歌最终为这种导航元素提出了一个标准解决方案,我认为它 - 至少为了保持一致性 - 最好按照其制造商的意图使用它。如果您确实需要您的应用以不同的方式运行,您可能应该使用 SlidingMenu 等,而不是尝试以不适合的方式弯曲 DrawerLayout。
      • 听起来不错,看起来 SlidingPaneLayout 可能更符合我的要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2017-10-02
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多