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

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

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

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

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

我find了一个解决scheme。 您可以configuration触摸边界,并使其与视图一样宽。 链接在这里

为Android导航抽屉设置拖动边距

谷歌,他们的方式他们的教程“如果用户触摸屏幕的左边缘(从左边20 dp)”,似乎他们不希望这种function。

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

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

他们不会在屏幕上的任何地方说或刷卡。 他们也没有任何应用程序(G +,Gmail等)的function,所以如果你想要的function,你应该坚持写自己的(手势)或第三方(如jfeinstein10)。

编辑:Youtube应用程序确实让你在任何地方刷卡,但至less有(4.5.17)版本看起来不像是使用他们的新API。

你可以使用这个

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

您可以使用手势检测器自己检测滑动手势,只需使用DrawerLayout.openDrawer()方法自己打开导航DrawerLayout.openDrawer()

正如其他人所说的那样,切尼在答复中已经说过 – 可能是最好的。 但是, DrawerLayoutDrawerLayout是不同的风格。 Google还增加了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> 

然后用操作栏主页button打开:

 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来处理滑动/打开/closures的时间。

我build议阅读亚当·鲍威尔的导航抽屉系列 – 第3部分使用SlidingPaneLayout VS导航抽屉:

第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