How to implement a DrawerLayout with a visible handle How to implement a DrawerLayout with a visible handle android android

How to implement a DrawerLayout with a visible handle


It's quite tricky.

I think this is similar to what is done to the drawer handle in new Google Maps app. Don't take my word, not sure. :)

I have written toggle that stays on the edge of the Activity content view.When the DrawerLayout is dragged, I translated the view on the x-axis by the amount of the minimal child (which is DrawerLayout content view) minus the shadow (if any). Since the shadow casted + content view of the DrawerLayout gives the full measured width of the entire drawer.

I quickly multiply the slided offset and the minimal child and find the x translation.

[Edit: Code has been removed for readability and it has been moved to the link provided below]

In your activity:

mDrawerToggle = new DrawerLayoutEdgeToggle(    this,     mDrawerLayout,     R.drawable.ic_launcher,     R.drawable.ic_launcher,    Gravity.LEFT,     true) {        @Override        public void onDrawerClosed(View view) {            super.onDrawerClosed(view); //must call super        }        @Override        public void onDrawerOpened(View view) {            super.onDrawerOpened(view); //must call super        }        @Override        public void onDrawerSlide(View view, float slideOffset) {            super.onDrawerSlide(view, slideOffset); //must call super        }    };mDrawerLayout.setDrawerListener(mDrawerToggle);

Creativity boost: You can add more cosmetics like distance from ActionBar which you can set as margin to the handle.

Also you can mimic "single-zipper effect" by moving the handle up/down along left/right just by translating on the Y axis. :)

Edit: Its available on my GitHub here

Edit 2: For those that can't get the handle appear at the beginning just use mDrawerToggle.setVerticalPostionOffset(0)


I found a way of doing this pretty easily thanks to the Aniqroid library written by Mobistry (SO pseudo)

I use the SlidingTray class which is a copy of android SlidingDrawer but lets you position the drawer to any corner of the screen.

I declared the element via xml

<com.sileria.android.view.SlidingTray     xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/drawer"    android:layout_width="match_parent"    android:layout_height="270dp"    android:content="@+id/content"    android:handle="@+id/handle" >    <ImageView        android:id="@+id/handle"        android:layout_width="320dp"        android:layout_height="24dp"        android:background="@drawable/tray_btn" />    <LinearLayout        android:id="@+id/content"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:gravity="fill_vertical"        android:orientation="vertical" >    </LinearLayout></com.sileria.android.view.SlidingTray>

And just had to call

Kit.init(this);

in my main Activity before inflating the layout.

I thank aniqroid devs!

https://code.google.com/p/aniqroid/