/* * Copyright (C) 2013 Priboi Tiberiu * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.marshalchen.common.uimodule.foldingLayout; import android.content.Context; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.DrawerLayout; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; /** * FoldingDrawerLayout change the sliding effect with folding effect of * DrawerLayout * */ public class FoldingDrawerLayout extends DrawerLayout { public FoldingDrawerLayout(Context context) { super(context); } public FoldingDrawerLayout(Context context, AttributeSet attrs) { super(context, attrs); } public FoldingDrawerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (isDrawerView2(child)) { System.out.println("at" + i); BaseFoldingLayout foldingNavigationLayout = new BaseFoldingLayout( getContext()); foldingNavigationLayout.setAnchorFactor(1); removeView(child); foldingNavigationLayout.addView(child); ViewGroup.LayoutParams layPar = child.getLayoutParams(); addView(foldingNavigationLayout, i, layPar); } } setDrawerListener(new DrawerListener() { @Override public void onDrawerStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (drawerView instanceof BaseFoldingLayout) { ((BaseFoldingLayout) drawerView).setFoldFactor(1-slideOffset); } } @Override public void onDrawerOpened(View arg0) { } @Override public void onDrawerClosed(View arg0) { } }); } public BaseFoldingLayout getFoldingLayout(View drawerView) { if (!isDrawerView2(getRealDrawer(drawerView))) { throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); } return isFoldingLayout(getRealDrawer(drawerView))?(BaseFoldingLayout)getRealDrawer(drawerView):null; } boolean isDrawerView2(View child) { final int gravity = ((LayoutParams) child.getLayoutParams()).gravity; final int absGravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(child)); return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0; } /** * Close the specified drawer view by animating it into view. * * @param drawerView * Drawer view to close */ public void closeDrawer(View drawerView) { super.closeDrawer(getRealDrawer(drawerView)); } private View getRealDrawer(View drawerView) { View drawerView2 = (View) drawerView.getParent(); if (isFoldingLayout(drawerView2)) { return drawerView2; } else { return drawerView; } } private boolean isFoldingLayout(View drawerView) { return drawerView instanceof BaseFoldingLayout; } }