Android Facebook样式幻灯片


283

新的Facebook应用程序及其导航非常酷。我只是想看看如何在我的应用程序中对其进行仿真。

有谁知道如何实现?

在此处输入图片说明

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

在此处输入图片说明

YouTube视频


2
是的,视频也将有助于了解确切的效果。
bool.dev 2011年

@ bool.dev的视频是:youtube.com/watch?
Harsha MV

@HarshaMV:-尝试查找此线程。我认为可能会有所帮助。stackoverflow.com/questions/8453320/…–
Shashank_Itmaster

3
关于Android中的滑出导航的非常好的文章-androiduipatterns.com/2012/06/…。必读。
AlexKorovyansky

我已经实现了自己的滑动菜单,请参见此处stackoverflow.com/a/15880375/1939564
穆罕默德·巴巴尔

Answers:


176

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

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

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

Android滑动菜单演示

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

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

设备的屏幕截图(完整滚动)。请注意,我的图标不如Facebook菜单图标宽,因此菜单视图和“应用”视图未对齐。

设备的屏幕截图(全屏)


1
@AmokraneChentir您可以通过调用getDrawingCache()非菜单活动并从位图创建ImageView 来使用其他活动。然后在类的方法上调用startActivity(intent)&以立即显示新活动并获得所需的效果。overridePendingTransition(0, 0)onClickClickListenerForScrolling
Siklab.ph 2012年

1
我不知道自定义Horizo​​ntalScrollView是否可以与ListView一起使用,因为Horizo​​ntalScrollView的正式文档提到它将强制ListView显示其整个项目。
shiami 2012年

1
分叉可在不使用片段的情况下切换活动!
Erik B

1
感谢您的帮助,我能够使用HorzScrollWithListMenu.java。
卡伦·安妮

2
非常感谢@PaulGrime ...这是一个非常简单的示例,最棒的事情是此演示中简单易懂且易于自定义,并且没有库项目可供使用。
Naveen Kumar

37

我已经在此图书馆项目中实现了类似Facebook的滑出导航。

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

在仓库中,您可以找到演示项目,以及如何使用lib来实现类似Facebook的导航。这是带有演示项目记录的简短视频

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

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

祝一切
顺利Alex


4
嗨,我刚刚发现,您每次打开侧边栏时,您的方法都会创建一个较大的屏幕截图位图。它将增加堆大小,并可能导致内存不足错误。
shiami 2012年

3
谢谢亲爱的科罗维扬斯克,非常好。但是在新的OS中不推荐使用绝对布局。您可以重新编码吗?
Hesam

感谢所有在github或此处提供反馈的人。我知道一些错误,并且对如何使该应用程序更好有想法。当我有空闲时间时,我做到了。
AlexKorovyansky

嗨,koroyansk。我正在使用您的图书馆,它运作良好。但是我有一点问题。当滑动条列表打开时,我将在listview项click上开始活动。活动开始正确,但是滑入动画不起作用。代码((MenuActivity) getActivity()).getSlideoutHelper().close(); startActivity(new Intent(getActivity(), MyActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra("category", position));
2012年

在您的情况下,新活动将立即打开而无需等待动画结束,您可以尝试扩展库并为动画结束添加回调。可能我会将此功能添加到库的下一个版本中。
AlexKorovyansky

24

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

更新:

这段代码对我来说似乎是最好的,它可以像G +应用一样移动整个操作栏。

Google如何做到这一点?在Android应用程序中滑动ActionBar


7
我写了这个库,很高兴您喜欢它。目前,它确实很基础,但我将在未来几周内对其进行改进。也非常欢迎其他人对其进行更改。
David Scott

这个图书馆绝对很棒。它是如此简单易用并且完美地工作。谢谢。我只是想补充一点,该示例仅适用于ICS(我认为是Honeycomb)。但是该库一直运行到2.1,我使用它没有问题。
Steven Elliott 2012年

还不错,这很简单,但是效果很好,安装起来也很快。但是,它不是从库外部进行配置的:所有项目都具有相同的简单布局,并且在旅途中不可能进行动态列表。这两件事都很容易适应,但是我确实需要在列表中进行分组,而这并不是那么容易。
htafoya

22

我认为,Facebook的应用程序不是写在本地代码(通过本机代码我的意思是,在Android中使用的布局),但他们对于IT部门使用的WebView,并使用了一些JavaScript UI库像煎茶。使用sencha框架可以轻松实现。

在此处输入图片说明


16
+1无需更改应用即可更新用户界面,因此它绝对是一个Web应用,而android应用基本上是一个Web浏览器。
鲁迪

7
我不确定情况是否一定如此。UI的框架可以是本机的(例如,实际菜单视图和其他本机视图),而这些视图的内容则是动态加载的。如果应用程序的框架发生变化,则可能需要更新。
Paul Grime 2012年

2
我认为Facebook应用程序不是Web应用程序。太流畅了,太快了。我知道网络/混合应用程序看起来像“本机”,但与本机相比仍然有些滞后。不仅骨架-列表,地图等看起来和感觉都是原生的。至少在当前的技术水平下。
Ixx 2013年

好的,有人告诉我,这个应用程序有两个月左右都不是这样-因此,您指的是一个我不知道的旧版本。无论如何,评论当前的应用程序肯定是本地的可能会很有帮助。
Ixx

20

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

此功能的一个优点是可以轻松地与ActionBarSherlock集成。

这是github项目链接

这是Google Play下载链接


2
我认为这是最好的
戒MV

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

有一个限制:

  • 所有水平滚动视图将无法在此视图范围内使用

最好的问候,史蒂文


如何将第一个用户界面设置为您的上传图片?我测试它的第一个UI是屏幕上的webView。我希望在应用启动时显示listview。通过您的lib是2.0,但您的演示是4.0,我希望您也可以使用2.0。那很酷
pengwang 2012年

@pengwang:我刚刚推送了一些代码来支持此功能。您可以在Activity.onResume()上通过调用viewActionsContentView.showActions();来完成此操作。
粗鲁的

是否可以禁用隐藏部分上的触摸事件?例如,当右侧部分处于活动状态时,右侧的所有视图都将被禁用。
Valeriy 2013年

显示操作一时,可能会阻止内容布局。我已经通过电子邮件将示例项目发送给您。
粗鲁的

16

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

v4支持库

导航抽屉设计模式


2
是的,支持的最低API等级为4
吴堡李

1
兼容性库使您可以在较旧的设备上使用它。我刚为姜饼和后来的产品开发了一个。
Tony Maro 2013年

2
这需要放在顶部。其他答案中有太多无关的第三方库。
杰森·阿克森


10

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

快照:

在此处输入图片说明


你能帮助我吗??与滑块的问题..这里是链接stackoverflow.com/questions/14500927/...
moDev

它可以让您通过触摸滑动吗?(平均滑动)
alicanbatur

@Edward我一直在处理您的示例,我认为它很好并且易于使用,但是在旋转屏幕时遇到了问题(我在android 3.1清单中使用android:configChanges =“ orientation”,因为我没有想要重新启动活动),屏幕旋转正常,但框架布局保持其大小,并且看起来不太好,您有办法解决吗?我已经尝试了一切,但无法解决。谢谢
zvzej 2013年

@Edward这是我使用您的样本提出的问题,请帮助我或给我一些建议,谢谢。stackoverflow.com/questions/16778911/…–
zvzej


8

尚无法评论@Paul Grime给出的答案,无论如何,我已经在他的github项目上提交了闪烁问题的解决方法...。

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

anim.setFillAfter(true);

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

app.clearAnimation();

希望这可以帮助 :)


6

我已经使用AbsoluteLayout和一个简单的幻灯片控制器实现了这一点,该控制器将视图移动到负偏移量以进行隐藏。

如果有人感兴趣,我可以清理代码/布局并发布。我知道AbsoluteLayout已过时,但这是一个非常简单的实现。左视图/右视图,然后在“滑动打开”时,只需将左视图从-X偏移移至设备的宽度即可-不论您想显示右视图


如果您没有AbsoluteLayout就可以做到,我将不胜感激!谢谢!
伊戈尔

4

您好,这是最好的示例演示应用程序,它提供类似滑动菜单的facebook。在这里检查代码

在此处输入图片说明

在此处输入图片说明


3

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

  1. 侧栏可以设置为任意位置:左,上,下,右
  2. 主视图和滑动视图均可单击
  3. 侧栏可以部分显示
  4. SideBar的样式化属性使更改样式更加容易
  5. Maven回购中的工件
  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



3

我找到了最简单的方法及其工作方式。使用简单的Navigation抽屉并调用抽屉.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>

Java文件

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

        }
    });
 }
}

在此处输入图片说明

谢谢


2

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

我假定它们的布局代表不可见的菜单。轻按菜单按钮时,它们会在顶部对布局/视图进行动画处理,以移动到其他地方,并仅使菜单布局可见。我还没有考虑过这会导致视图中出现任何z-index问题,或者它们如何控制这些问题。


如果您使用过该应用程序,那么您实际上可以看到布局向右滑动,让位于菜单部分。我将尝试制作视频并将其上传。
Harsha MV

1
我使用的是iPhone版本,如果Android版本相同,那么我怀疑它与我描述的内容有很大不同。我没有在Android上编写许多动画,所以我无法告诉您动画代码是什么样的,但是用粗略的话来说,我认为它就是我所描述的。
jlindenbaum

谢谢,youtube.com / watch?v = ANLMaL7zn20在iPhone上是否具有相同的效果。
Harsha MV,


2

这是在官方android文档中找到的设计和开发指南,无需添加非官方的外部库。只有android支持库才能使用。在此处找到链接。

设计开发


1

Facebook Android应用程序可能是使用Fragments构建的。菜单是一个片段,深入的活动(Newsfeed / Events / Friends等)是另一个片段。基本上是平板电脑在手机上的“主从细节”布局。


在这种情况下,我们需要在片段内制作动作栏,所以我们不能使用Android框架的任何功能来构建它,对吗?实际上,我不确定Facebook,但是对于许多开发人员来说,在没有框架帮助的情况下制作actionbar的方法太难了,我希望这次已经结束。
AlexKorovyansky

1

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

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

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


1

过去几天,我一直在研究这个问题,最后提出了一个非常简单的解决方案,该解决方案在Honeycomb之前就可以使用。我的解决方案是为我要滑动的View设置动画(FrameLayout听我说),并听动画的结尾(此时要偏移View的左/右位置)。我在这里粘贴了解决方案:如何为View的翻译制作动画


1

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

使用不带XML的Java代码实现侧边菜单栏


1

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

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

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


0

2012年6月,Google在Eclipse ADT插件中添加了“模板”,并且有一个名为“主/详细信息流”的模板可以做到这一点(基于fragmets)


1
主/详细流程不是所关注的侧边栏菜单。它只是两个片段一起显示(平板电脑)或分开显示(电话)。
粉碎

好吧,2013年6月,添加了“导航抽屉布局”,这与此处更相似,但是ActionBar不会随抽屉一起滑动,因为这里需要Facebook样式的滑动条。
Khulja Sim Sim 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.