285

新的 Facebook 应用程序及其导航非常酷。我只是想看看如何在我的应用程序中模拟它。

任何人都知道如何实现它?

在此处输入图像描述

单击左上角按钮时,页面滑动并显示以下屏幕:

在此处输入图像描述

Youtube 视频

4

25 回答 25

176

我自己玩过这个,我能找到的最好的方法是使用 FrameLayout 并在菜单顶部放置一个自定义的 Horizo​​ntalScrollView (HSV)。HSV 内部是您的应用程序视图,有一个透明视图作为第一个子视图。这意味着,当 HSV 的滚动偏移为零时,菜单将显示出来(并且仍然可以令人惊讶地单击)。

当应用程序启动时,我们将 HSV 滚动到第一个可见应用程序 View 的偏移量,当我们想要显示菜单时,我们向后滚动以通过透明 View 显示菜单。

代码在这里,Launch 活动中的底部两个按钮(称为 HorzScrollWithListMenu 和 HorzScrollWithImageMenu)显示了我能想到的最佳菜单:

Android滑动菜单演示

模拟器的屏幕截图(中滚动):

模拟器的屏幕截图(中滚动)

设备截图(全滚动)。请注意,我的图标没有 Facebook 菜单图标那么宽,因此菜单视图和“应用程序”视图没有对齐。

设备截图(全滚动)

于 2011-12-29T21:41:46.043 回答
37

我在这个库项目中实现了类似 facebook 的滑出式导航。

您可以轻松地将其构建到您的应用程序、UI 和导航中。您只需要实现一个 Activity 和一个 Fragment,让库知道它 - 库将提供所有想要的动画和导航。

在 repo 中,您可以找到演示项目,其中包含如何使用 lib 实现类似 facebook 的导航。这是带有演示项目记录的短视频

此外,此库应与此 ActionBar 模式兼容,因为它基于活动事务和 TranslateAnimations(不是片段事务和自定义视图)。

目前,最大的问题是使其适用于支持纵向和横向模式的应用程序。如果您有任何反馈,请通过 github 提供。

一切顺利,
亚历克斯

于 2012-03-19T10:24:56.227 回答
24

这是另一个库,在我看来似乎是最好的。我没写。。

更新:

这段代码似乎最适合我,它移动整个操作栏,类似于 G+ 应用程序。

谷歌是如何做到这一点的?在 Android 应用程序中滑动 ActionBar

于 2012-06-03T18:19:25.257 回答
22

我认为 facebook 应用程序不是用本机代码编写的(我的意思是本机代码,在 Android 中使用布局),但他们使用了 webview 并使用了一些 javascript ui 库,如sencha。使用 sencha 框架可以轻松实现。

在此处输入图像描述

于 2011-12-29T05:13:45.997 回答
20

这是另一个(非常好的)开源库!

这个很好的特点是它很容易与 ActionBarSherlock 集成。

这是github项目链接

这是Google Play下载链接

于 2013-01-10T11:45:10.723 回答
17

我刚刚为我自己的项目实现了类似的视图。你可以在这里查看

这是基于我编写的库的示例应用程序屏幕: ActionsContentView 示例

将此自定义视图用作 XML 布局的元素很容易。这是示例:

    <shared.ui.actionscontentview.ActionsContentView
      android:id="@+id/content"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:actions_layout="@layout/actions"
      app:content_layout="@layout/content" />

如果您对 ActionsContentView 库的使用有任何疑问,我可以在项目 Wiki 上写一篇小文章。

这个库的一些优点:

  • 通过触摸滑动视图的能力
  • 在 XML 中调整操作栏的大小很容易
  • 支持从 2.0 及以上的所有 Android SDK 版本

有一个限制:

  • 所有水平滚动视图都不会在此视图的范围内工作

最好的问候,史蒂文

于 2012-07-16T00:11:06.320 回答
16

使用 android 支持包修订版 13(2013 年 5 月),有 DrawerLayout 用于创建可以从窗口边缘拉入的导航抽屉。而且,导航抽屉现在是一种设计模式。

v4 支持库

导航抽屉设计模式

于 2013-05-15T20:41:21.657 回答
15

对现有实现进行了综述,并将其变成了一个库项目和示例应用程序。还添加了 XML 解析以及对可能存在的操作栏的自动检测,因此它可以与本机以及支持操作栏(如 ActionBarSherlock)一起使用。

这也将操作栏滑开!

整个事情是一个库项目和一个示例应用程序,并在A slide Menu for Android like google and facebook apps中进行了描述。感谢scirocco最初的想法和代码!

姜饼上的 SlideMenu 带有 ActionBar 的 ICS 上的 SlideMenu

于 2012-07-17T23:14:32.447 回答
10

我认为该库没有提到:

jfeinstein10 /滑动菜单

github url:https://github.com/jfeinstein10/SlidingMenu

  • 与有助于向后兼容的操作栏ActionBarSherlock一起工作正常!
  • 支持右滑,而不仅仅是通过按钮滑动!
于 2013-02-17T19:15:17.440 回答
10

这简单而优雅:https ://github.com/akotoe/android-slide-out-menu.git

快照:

在此处输入图像描述

于 2013-01-02T06:17:39.060 回答
8

还不能评论@Paul Grime 给出的答案,无论如何我已经在他的 github 项目上提交了闪烁问题的修复....

我会在这里发布修复程序,也许有人需要它。您只需要添加两行代码。anim.setAnimationListener 调用下面的第一个:

anim.setFillAfter(true);

app.layout() 调用后的第二个:

app.clearAnimation();

希望这可以帮助 :)

于 2012-04-20T19:26:44.500 回答
6

我已经用 AbsoluteLayout 和一个简单的滑动控制器实现了这个,它将视图移动到负偏移以隐藏。

如果有人感兴趣,我可以清理代码/布局并发布。我知道 AbsoluteLayout 已被弃用,但它是一个非常直接的实现。左视图/右视图,当“滑动打开”时,只需将左视图从 -X 偏移量移出到设备的宽度 - 无论你想显示什么右视图

于 2012-01-09T19:04:45.803 回答
4

你好,这是最好的示例演示应用程序,它提供像幻灯片菜单一样的 facebook。在此处检查代码

在此处输入图像描述

在此处输入图像描述

于 2013-04-11T06:12:55.067 回答
3

最近我一直在研究我的滑动菜单实现版本。它使用流行的 J.Feinstein Android 库 SlidingMenu。

请查看 GitHub 上的源代码:

https://github.com/baruckis/Android-SlidingMenuImplementation

直接下载app到设备上试试:

https://play.google.com/store/apps/details?id=com.baruckis.SlidingMenuImplementation

由于注释,代码应该是不言自明的。我希望它会有所帮助!;)

于 2013-05-18T23:03:11.027 回答
3

作为我的 Android 公共库 (ACL) 的一部分,我实现了自己的 SideBar。主要优点:

  1. 侧边栏可设置为任意位置:左、上、下、右
  2. 主视图和滑动视图都是可点击的
  3. 侧边栏可以部分显示
  4. SideBar 的样式化属性更容易改变它的样式
  5. maven repo 中的神器
  6. 大图书馆的一部分

源代码:https ://github.com/serso/android-common/tree/master/views/src/main/java/org/solovyev/android/view/sidebar

用法:https ://github.com/serso/android-common/blob/master/samples/res/layout/acl_view_layout.xml

于 2013-04-04T10:33:17.557 回答
3

我找到了一种最简单的方法及其工作方式。使用简单的导航抽屉并调用drawer.setdrawerListner() 并在下面的drawerSlide 方法中使用mainView.setX() 方法或复制我的代码。

xml文件

 <android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >

<RelativeLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">

  <ImageView
      android:layout_width="40dp"
      android:layout_height="40dp"
      android:id="@+id/menu"
      android:layout_alignParentTop="true"
      android:layout_alignParentLeft="true"
      android:layout_marginTop="10dp"
      android:layout_marginLeft="10dp"
      android:src="@drawable/black_line"
      />
</RelativeLayout>


<RelativeLayout
    android:id="@+id/left_drawer"
    android:layout_width="200dp"
    android:background="#181D21"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    >
    </RelativeLayout>
 </android.support.v4.widget.DrawerLayout>

文件

   public class MainActivity extends AppCompatActivity {
DrawerLayout drawerLayout;
RelativeLayout mainView;
ImageView menu;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    menu=(ImageView)findViewById(R.id.menu);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mainView=(RelativeLayout)findViewById(R.id.content_frame);

    menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            drawerLayout.openDrawer(Gravity.LEFT);
        }
    });

    drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            mainView.setX(slideOffset * 300);
        }

        @Override
        public void onDrawerOpened(View drawerView) {

        }

        @Override
        public void onDrawerClosed(View drawerView) {

        }

        @Override
        public void onDrawerStateChanged(int newState) {

        }
    });
 }
}

在此处输入图像描述

谢谢你

于 2016-04-11T13:01:08.090 回答
2

我将在这里做一些大胆的猜测......

我假设他们有一个代表不可见菜单的布局。当点击菜单按钮时,它们会为顶部的布局/视图设置动画以移开,并简单地启用菜单布局的可见性。我没有想过这会导致视图中出现任何类型的 z-index 问题,或者他们如何控制它。

于 2011-12-28T16:34:06.527 回答
2

这是官方android文档中的设计和开发指南,无需添加非官方的外部库。只有 android 支持库会做。在这里找到链接。

设计开发

于 2014-05-26T12:16:02.143 回答
2

Android 添加了导航抽屉。参考这个

关联

于 2014-04-03T13:32:11.533 回答
1

经过几个小时的搜索,我发现 Paul Grime 的解决方案可能是最好的解决方案。但是它的功能太多了。所以对于初学者来说可能很难学习。所以我想提供我的实现,它来自 Paul 的想法,但它更简单,应该易于阅读。

使用没有XML的java代码实现侧边菜单栏

于 2012-08-24T15:10:06.467 回答
1

对于信息,由于兼容性库从 1.6 开始,并且这个 facebook 应用程序也在 Android 1.5 的设备上运行,因此无法使用 Fragments 完成。

你可以这样做的方法是:创建一个“基础”活动 BaseMenuActivity ,在其中放置菜单列表的 onItemClickListener 的所有逻辑并定义 2 个动画(“打开”和“关闭”)。在动画结束/开始时,您显示/隐藏 BaseMenuActivity 的布局(我们称之为 menu_layout)。此活动的布局很简单,它只是一个包含项目的列表 + 列表右侧的透明部分。这部分将是可点击的,其宽度将与“移动按钮”的宽度相同。这样,您将能够单击此布局以启动动画,让 content_layout 向左滑动并占据整个屏幕。对于每个选项(即菜单列表项),您创建一个扩展 BaseMenuActivity 的“ContentActivity”。然后,当您单击列表中的某个项目时,您将启动 ItemSelectedContentActivity 并显示菜单(一旦您的活动开始,您将关闭该菜单)。每个 ContentActivity 的布局都是 FrameLayout 并且包括 和 。您只需要移动 content_layout 并在需要时使 menu_layout 可见。

这是一种方法,我希望我已经足够清楚了。

于 2012-03-31T13:41:00.900 回答
1

Facebook Android 应用程序可能是使用Fragments构建的。菜单是一个片段,深入的活动(新闻源/事件/朋友等)是另一个片段。基本上是手机上的平板电脑“主&细节”布局。

于 2012-03-28T10:15:17.373 回答
1

我没有在上述答案的任何地方看到令人惊叹的 SimonVT/android-menudrawer。所以这里有一个链接

https://github.com/SimonVT/android-menudrawer

它超级易于使用,您可以将其放在左侧、右侧、顶部或底部。使用示例代码和 Apache 2.0 许可证很好地记录了文档。

于 2013-02-13T08:29:49.493 回答
1

在过去的几天里,我一直在玩这个,我想出了一个最终非常简单的解决方案,并且可以在 Honeycomb 之前使用。我的解决方案是为我想要滑动的视图设置动画(FrameLayout对我来说)并监听动画的结束(此时偏移视图的左/右位置)。我在这里粘贴了我的解决方案:如何为视图的翻译设置动画

于 2012-07-03T15:05:49.593 回答
0

2012 年 6 月,Google 在 Eclipse ADT 插件中添加了“模板”,并且有一个名为“master/detail flow”的模板可以做到这一点(基于片段)

于 2012-10-26T07:49:57.420 回答