ChatGPT解决这个技术问题 Extra ChatGPT

Android Facebook style slide

The new Facebook application and its navigation is so cool. I was just trying to see how it can be emulated in my application.

Anyone has a clue how it can be achieved?

https://i.stack.imgur.com/wmQtc.jpg

On clicking the the top left button the page slide and the following screen is shown:

https://i.stack.imgur.com/hbZD7.jpg

YouTube Video

yes a video will also be helpful, to get to know the exact effect.
@bool.dev here is the video: youtube.com/watch?v=ANLMaL7zn20
@HarshaMV:- Try looking this thread.I think may help you somewhat.stackoverflow.com/questions/8453320/…
Very good article about slide-out navigation in Android - androiduipatterns.com/2012/06/…. Must read.
I have implemented my own sliding menu, see here stackoverflow.com/a/15880375/1939564

o
onkar

I've had a play with this myself, and the best way I could find was to use a FrameLayout and lay a custom HorizontalScrollView (HSV) on top of the menu. Inside the HSV are your application Views, but there is a transparent View as the first child. This means, when the HSV has zero scroll offset, the menu will show through (and still be clickable surprisingly).

When the app starts up, we scroll the HSV to the offset of the first visible application View, and when we want to show the menu we scroll back to reveal the menu through the transparent View.

The code is here, and the bottom two buttons (called HorzScrollWithListMenu and HorzScrollWithImageMenu) in the Launch activity show the best menus I could come up with:

Android sliding menu demo

Screenshot from emulator (mid-scroll):

https://i.stack.imgur.com/ck9hD.png

Screenshot from device (full-scroll). Note my icon is not as wide as the Facebook menu icon, so the menu view and 'app' view are not aligned.

https://i.stack.imgur.com/PHmtw.png


@AmokraneChentir You can use different activities by calling getDrawingCache() in your non-menu activities and creating an ImageView from the bitmap. Then call startActivity(intent) & overridePendingTransition(0, 0) at the onClick method of the ClickListenerForScrolling class to immediately show the new activity and get the desired effect.
I wonder if the custom HorizontalScrollView can use with ListView since the official document of HorizontalScrollView mentioned that it will force the ListView to display its entire items.
this fork switches the activies without using fragments!
Thanks for your help, I was able to use the HorzScrollWithListMenu.java.
Thank you very much @PaulGrime ...this is a great simple example and the most awesome thing is in this demo simple easy to understand and easily customize and there is no library project to use.
A
AlexKorovyansky

I've implemented facebook-like slideout navigation in this library project.

You can easy built it into your application, your UI and navigation. You will need to implement only one Activity and one Fragment, let library know about it - and library will provide all wanted animations and navigation.

Inside the repo you can find demo-project, with how to use the lib to implement facebook-like navigation. Here is short video with record of demo project.

Also this lib should be compatible this ActionBar pattern, because is based on Activities transactions and TranslateAnimations (not Fragments transactions and custom Views).

Right now, the most problem is to make it work well for application, which support both portrait and landscape mode. If you have any feedback, please provide it via github.

All the best, Alex


Hi, I just figured out that your approach is going to create a large screenshot bitmap every time you open the sidebar. It will grow the heap size and may cause out of memory error.
Thanks dear korovyansk, Its very nice. but Absolute layout is deprecated in new OSs. Can you re code it again?
Thanks everybody who gives feedback in github or here. I know about some bugs and have ideas how make the app better. I make it, when I will have free time.
Hi koroyansk. I am using your library it work well. But I have a little problem. When slide bar list open I am starting the activity on listview item click.Activity start correct but slide-in animation does not work. Code ((MenuActivity) getActivity()).getSlideoutHelper().close(); startActivity(new Intent(getActivity(), MyActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra("category", position));
in your case, new activity will open immediately without waiting of animation end, you can try to extend library and add callback for end of animation. may be I will add this feature to next version of library.
C
Community

Here is another lib and seems to be the best in my opinion. I did not write it..

UPDATE:

This code seems to work best for me and it moves the entire Actionbar similar to the G+ app.

How did Google manage to do this? Slide ActionBar in Android application


I wrote this library, glad you like it. It's really basic for now, but I will be improving it over the coming weeks. More than welcome for other people to make changes to it as well.
This library is absolutely wonderful. It's so simple to use and works perfectly. Thank you. I'd just like to add that the sample only works with ICS (and Honeycomb I think) .. but the library works all the way back to 2.1, I'm using it no problems.
Not bad, it's pretty simple but works well and the setup is really quick. However, it's not very configurable from outside the library: all items have the same simple layout, and on the go there is no possibility of dynamic listing; both things would be easy to adapt but I really need grouping inside the list and that won't be that easy.
a
alex

I think facebook app is not written in native code (by native code I mean, using layouts in Android) but they have used webview for it and have used some javascript ui libraries like sencha. It can be easily achieved using sencha framework.

https://i.stack.imgur.com/hDV6A.jpg


+1 The UI can changed without App Update, so it's definitely a web app and the android app is basically a web browser.
I'm not sure this is necessarily the case. The skeleton for the UI can be native (e.g. the actual menu View and other native Views), and the content for those Views loaded dynamically. If the skeleton of the app changes, then an update would likely be required.
I don't think that the facebook app is a webapp. Too fluent, quick. I know web/hybrid apps which look good "like native", but there's still a bit of lag compared to native. Not only the skeleton - the lists, map, etc. looks and feels native. At least with the current state of technology.
Ok, somebody told me that this app wasn't like this for about 2 months - so you're refering to an old version which I don't know. Anyways it might be informative to comment that the current app is definitely native.
d
dwbrito

Here is yet another (very nice) open source library!

The good feature about this one is that it is easily integrated with ActionBarSherlock.

Here's the github project link

Here's the Google Play download link


o
onkar

I've just implemented similar view for my own project. You can check it here

https://i.stack.imgur.com/G5NJ1.jpg

It is easy to use this custom view as element of XML layout. Here is example:

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

I you will have any questions about usage of ActionsContentView library I can write a small article at projects Wiki.

Some advantages of this library:

ability to slide view by touch

it is easy to adjust size of actions bar in XML

support of all Android SDK version starting from 2.0 and up

There is one limitation:

all horizontal scrolling views will not work at bounds of this view

Best regards, Steven


how to set frist UI is as your upload pic? i test it frist UI is webView on the screen. i hope listview is show when app is start. through your lib is 2.0,but your demo is 4.0,i hope you can also use 2.0.that is cool
@pengwang: I've just pushed some code to support this feature. You can do this while Activity.onResume() by calling viewActionsContentView.showActions();
Is it possible to disable touch events on hidden part ? For instance, when the right part is active then all views on the right are disabled.
There is possibility to block content layout while action one is shown. I've emailed you a sample project.
W
Wubao Li

With android support package revision 13( may 2013), there is DrawerLayout for creating a Navigation Drawer that can be pulled in from the edge of a window. And, navigation drawer is a design pattern now.

v4 support library

navigation drawer design pattern


Yes, minimum API level supported is 4.
And the compatibility library lets you use it on older devices. I just developed one for Gingerbread and later.
This needs to be further at the top. Too many extraneous third-party libraries in the other answers.
C
Community

Did a roundup of an existing implementation and turned it into a library project plus example app. Also added XML parsing as well as autodetection of a possibly present actionbar, so it works with the native as well as a support action bar such as ActionBarSherlock.

This one also slides the action bar away!

The whole thing is a library project together with an example app and is described over at A sliding Menu for Android like google and facebook apps. Thanks to scirocco for the initial idea and code!

https://i.stack.imgur.com/sa6ej.png


E
Edward

This is simple and elegant: https://github.com/akotoe/android-slide-out-menu.git

Snapshot:

https://i.stack.imgur.com/XQu4x.png


can you help me?? Question related to slider.. Here is the link stackoverflow.com/questions/14500927/…
does it let you to slide by touching ? (mean swipe)
@Edward I have been working with your sample, I think is great and easy to use but came to a problem, when rotating screen (I'm using android:configChanges="orientation" in the manifest with android 3.1 because I don't want the activity to be restarted) the screen rotates fine but the framelayout keeps its size and it doesn't look good, do you have a way around this? I have tried everything but can't fix it. thanks
@Edward here is my question using your sample, please help me or give me some advice thanks. stackoverflow.com/questions/16778911/…
m
madlymad

I think that library does not mentioned:

jfeinstein10 / SlidingMenu

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

works fine with action bar ActionBarSherlock which helps in backward compatibility!

Support right slide and not only slide via button!


F
Fatal1ty2787

Can't comment on the answer given by @Paul Grime yet, anyway I've submitted on his github project the fix for the flicker problem....

I'll post the fix here, maybe someone needs it. You just need to add two lines of code. The first one below the anim.setAnimationListener call:

anim.setFillAfter(true);

And the second one after app.layout() call:

app.clearAnimation();

Hope this helps :)


R
Rich

I've implemented this with AbsoluteLayout and a simple slide controller that moves the view to a negative offset to hide.

If anyone is interested, I can clean up the code/layout and post. I know AbsoluteLayout is deprecated, but it was a very straight forward implementation. Left View/ Right View, and when "sliding open", just move the left view out from a -X offset to the device's width - whatever you want to show of the Right View


I'll apreciate if you can do it without AbsoluteLayout! Thanks!
M
Mukesh Y

Hello this is best sample demo app which provides facebook like slide menu. Check the code here

https://i.stack.imgur.com/RIpYY.jpg

https://i.stack.imgur.com/BSfox.jpg


s
se.solovyev

As a part of my Android Common Library (ACL) I implemented own SideBar. Main advantages:

Side bar can be set to any position: left, top, bottom, right Both main view and sliding view are clickable Side bar can be partially shown Stylable attributes for SideBar make easier to change it's style Artifact in maven repo Part of a big library

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

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


A
Andrius Baruckis

Recently I have worked on my sliding menu implementation version. It uses popular J.Feinstein Android library SlidingMenu.

Please check the source code at GitHub:

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

Download app directly to the device to try:

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

Code should be self-explanatory because of comments. I hope it will be helpful! ;)


D
Dalvinder Singh

I found a simplest way for it and its working. Use simple Navigation drawer and call drawer.setdrawerListner() and use mainView.setX() method in on drawerSlide method below or copy my code.

xml file

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

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

        }
    });
 }
}

https://i.stack.imgur.com/PNAi8.png

Thank You


j
jlindenbaum

I'm going to make some bold guesses here...

I assume they have a layout that represents the menu that is not visible. When the menu button is tapped, they animate the layout/view on top to move out of the way, and simply enable the visibility of the menu layout. I have not thought about this causing any sort of z-index issues in the views, or how they control that.


if you have used the app.. u can actually see that the layout slides to the right giving way to the menu section. i will try and make a video and upload it.
I use the iPhone version, if the Android version is the same, then I doubt it's much different than what I described. I haven't written many animations on Android, so I couldn't tell you what the animation code looks like, but in rough words, I assume it's what I described.
thank you, youtube.com/watch?v=ANLMaL7zn20 is it the same effect on iPhone.
D
Deepak Goel

Android added the navigation drawer. Refer this

link


j
jai_b

Here is the design and development guide found in official android documentation no need to add unofficial external library. Only android support library will do. Find the links here.

design and develop.


o
onosendai

The Facebook Android app is possibly build with Fragments. The menu is one Fragment, the in-depth Activity (Newsfeed/Events/Friends etc) is the other Fragment. Basically a tablet 'master & detail' layout on a phone.


In this case we need to make actionbar inside fragment, so we cannot use any features of Android framework to build it, right? Actually I cannot be sure about facebook, but for many developers is too hard way to make actionbar without help of framework, I hope this time is already over.
p
p4u144

For info, as the compatibility library starts with 1.6 and this facebook app is also running on devices with Android 1.5, it could not be done with Fragments.

The way you could do it, is : Create a "base" activity BaseMenuActivity where you put all the logic for the onItemClickListener for your menu list and defines the 2 animation ("open" and "close"). At the end/beginning of the animations, you show/hide the layout of the BaseMenuActivity (lets call it menu_layout). The layout for this activity is simple, its only a list with items + a transparent part at the right of your list. This part will be clickable and its width will be the same width as your "move button". With that, you'll be able to click on this layout to start the animation to let the content_layout slide to the left and take the whole screen. For each option (i.e. item of the menu list), you create a "ContentActivity" which extends the BaseMenuActivity. Then when you click on an item of the list, you start your ItemSelectedContentActivity with the menu visible (which you'll close as soon as your activity starts). The layouts for each ContentActivity are FrameLayout and includes the and . You just need to move the content_layout and make the menu_layout visible when you want.

That's a way to do it, and I hope I've been clear enough.


C
Community

I've been playing with this the past few days and I've come up with a solution that's quite straightforward in the end, and which works pre-Honeycomb. My solution was to animate the View I want to slide (FrameLayout for me) and to listen for the end of the animation (at which point to offset the View's left/right position). I've pasted my solution here: How to animate a View's translation


C
Community

After a search for several hours, I found Paul Grime's solution probably is the best one. But it has too much functionality in it. So it may be hard to study for beginners. So I would like to provide my implementation which is came from Paul's idea but it is simpler and should be easy to read.

implementation of side menu bar by using java code without XML


l
lwegener

I didn't see the amazing SimonVT/android-menudrawer mentioned anywhere in the above answers. So here's a link

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

Its super easy to use and you can put it on left, right, top or bottom. Very well documented with sample code and Apache 2.0 license.


r
rds

In June 2012, Google has added "templates" in the Eclipse ADT plugin, and there is a template called "master/detail flow" which does exactly that (based on fragmets)


Master/detail flow is not a sidebar menu in question. It is just two fragments displayed together (tablet) or separately (phone).
Well, in June 2013, Navigation Drawer Layout has been added, which is what more similar to need here, yet the ActionBar won't slide with drawer as Facebook style slider bar need here.