Search code examples
androidgmailnavigation-drawertabletmaterial-design

Implementing Gmail Tablet like Navigation Drawer


I was looking into the tablet design of Gmail application. In that Navigation Drawer implementation is different from others. I have attached image for your reference.

enter image description here

And also when I expand the the drawer it should happen like normal navigation drawer behavior.

enter image description here

I would like to implement in the same way. I was searching but i found only this link Which is not so helpful. Can anyone give me suggestions how can I do this!


Solution

  • You can use a SlidingPaneLayout with a margin on the main pane and custom listener for the cross fading.

    <com.sqisland.android.CrossFadeSlidingPaneLayout
        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">
      <FrameLayout
          android:layout_width="240dp"
          android:layout_height="match_parent"
          android:background="@color/purple">
      <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:text="@string/full"/>
      <TextView
          android:layout_width="64dp"
          android:layout_height="match_parent"
          android:background="@color/blue"
          android:text="@string/partial"/>
      </FrameLayout>
      <TextView
          android:layout_width="400dp"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:layout_marginLeft="64dp"
          android:background="@color/light_blue"
          android:text="@string/pane_2"/>
    </com.sqisland.android.CrossFadeSlidingPaneLayout>
    

    Subclass SlidingPaneLayout and find the partial and full panes in onFinishInflate:

    protected void onFinishInflate() {
      super.onFinishInflate();
    
      if (getChildCount() < 1) {
        return;
      }
    
      View panel = getChildAt(0);
      if (!(panel instanceof ViewGroup)) {
        return;
      }
    
      ViewGroup viewGroup = (ViewGroup) panel;
      if (viewGroup.getChildCount() != 2) {
        return;
      }
      fullView = viewGroup.getChildAt(0);
      partialView = viewGroup.getChildAt(1);
    
      super.setPanelSlideListener(crossFadeListener);
    }
    

    Change the alpha of the full pane and partial pane with a listener:

    private SimplePanelSlideListener crossFadeListener 
        = new SimplePanelSlideListener() {
      public void onPanelSlide(View panel, float slideOffset) {
        super.onPanelSlide(panel, slideOffset);
        if (partialView == null || fullView == null) {
          return;
        }
    
        partialView.setVisibility(isOpen() ? View.GONE : VISIBLE);
        partialView.setAlpha(1 - slideOffset);
        fullView.setAlpha(slideOffset);
      }
    };
    

    Also, hide the partial pane when the layout is opened.

    protected void onLayout(
        boolean changed, int l, int t, int r, int b) {
      super.onLayout(changed, l, t, r, b);
    
      if (partialView != null) {
        partialView.setVisibility(isOpen() ? View.GONE : VISIBLE);
      }
    }
    

    More info: http://blog.sqisland.com/2015/01/partial-slidingpanelayout.html