22

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

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

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

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

4

5 回答 5

11

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

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

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

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

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

于 2013-06-17T16:18:22.403 回答
11

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

为 Android Navigation Drawer 设置拖动边距

于 2013-07-23T06:12:46.353 回答
6

你可以用这个

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); 
于 2013-11-04T09:19:57.140 回答
3

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

我最终SlidingPaneLayout以这种方式实现了 a,因为它毕竟是我正在寻找的东西。(这也是 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>

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

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

于 2013-06-17T17:19:58.417 回答
2

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

于 2013-06-11T18:09:53.110 回答