触摸任意位置以滑动导航抽屉的打开菜单

时间:2013-05-16 09:13:22

标签: android navigation-drawer

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

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

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

  

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

5 个答案:

答案 0 :(得分:10)

谷歌,从他们的教学方式来说“如果用户触摸屏幕的左边缘(距离左边20 dp)”,似乎他们不想要这个功能。

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

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

他们不会在屏幕上的任何位置说或滑动。他们在任何应用程序(G +,Gmail等)中也没有这种功能,所以如果你想要这个功能,你应该坚持自己编写(带手势)或第三方(例如jfeinstein10)。

编辑: Youtube应用程序确实允许你滑动任何地方,但我至少有版本(4.5.17)看起来不像是使用他们的新api。

答案 1 :(得分:10)

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

Set drag margin for Android Navigation Drawer

答案 2 :(得分:5)

您可以使用此

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

答案 3 :(得分:3)

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

我最终以这种方式实现了SlidingPaneLayout,因为它更像是我一直在寻找的东西。 (这也是YouTube /环聊应用的风格)

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

然后使用操作栏主页按钮打开:

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

答案 4 :(得分:2)

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