package pl.verdigo.libraries.drawer.internal; import pl.verdigo.libraries.drawer.Drawer; import android.annotation.TargetApi; import android.content.Context; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; public class LeftDrawer extends Drawer { private DrawerProxy mDrawerProxy; public LeftDrawer(Context context, int layout) { super(context, layout); } protected int getTargetPosition() { return getDrawerWidth(); } protected boolean isRightDrawer() { return false; } /** * Creates DrawerProxy object. * * @return DrawerProxy object */ protected IDrawerProxy createDrawerProxy() { if (mDrawerProxy == null) { mDrawerProxy = new DrawerProxy(mDrawerActivity, mDrawer, mDrawerShadow, mDrawerContent); } return mDrawerProxy; } /** * Handles touch events. If {@link Drawer} is not movable all touch events * are ignored. * * @param view Touched view * @param event Event */ public boolean onTouch(View view, MotionEvent event) { if (!mMovable) { return false; } int drawerWidth = getDrawerWidth(); if (event.getAction() == MotionEvent.ACTION_UP && isAllowCloseOnTouch()) { int border = drawerWidth - (drawerWidth / 3); if (mMovedPosition < border) { cancel(); return true; } else if (mMovedPosition >= drawerWidth && !mMovedBeyondMargin) { cancel(); return true; } mMovedBeyondMargin = false; if (mMovedPosition < drawerWidth && isAnimationEnabled()) { showWithAnimation(); } else if (!isAnimationEnabled()) { IDrawerProxy proxy = createDrawerProxy(); proxy.setPosition(drawerWidth); } mDeviation = 0; mMoved = false; mMovedPosition = 0; return true; } if (event.getAction() == MotionEvent.ACTION_UP && !isAllowCloseOnTouch()) { mMovedBeyondMargin = false; if (isAnimationEnabled()) { showWithAnimation(); } else { IDrawerProxy proxy = createDrawerProxy(); proxy.setPosition(drawerWidth); } mDeviation = 0; mMoved = false; return true; } else if (event.getAction() == MotionEvent.ACTION_DOWN) { mDeviation = Math.round(event.getRawX()) - getDrawerWidth(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { mMoved = true; mMovedPosition = Math.round(event.getRawX() - mDeviation); if (mMovedPosition < 0) { mMovedPosition = 0; } if (mMovedPosition >= drawerWidth) { mMovedPosition = drawerWidth; } else { mMovedBeyondMargin = true; } IDrawerProxy proxy = createDrawerProxy(); proxy.setPosition(mMovedPosition); return true; } return false; } /** * Internal DrawerProxy class to handle animation of {@link Drawer} * * @author Lukasz Milewski <lukasz.milewski@gmail.com> */ public class DrawerProxy implements IDrawerProxy { private int mOriginalWidth; private View mView; private View mViewAlpha; private AnimatorProxy mViewAlphaProxy; private View mViewShadow; private View mViewWidth; private int mDrawerWidth; public DrawerProxy(View view, View viewWidth, View viewShadow, View alphaView) { mView = view; mViewWidth = viewWidth; mViewShadow = viewShadow; mViewAlpha = alphaView; mViewAlphaProxy = AnimatorProxy.wrap(alphaView); mOriginalWidth = mActivityWidth; mDrawerWidth = getDrawerWidth(); } public int getLeft() { return mView.getPaddingLeft(); } public void setAlpha(int position) { float value = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.7f + 0.3f; mViewAlphaProxy.setAlpha(value); } public void setPosition(int position) { setLeftPadding(mView, position); setLeftPadding(mViewShadow, position - mShadowWidth); setWidth(mView, mOriginalWidth + position); setWidth(mViewShadow, position); setWidth(mViewWidth, position); if ((mMoveDrawer || mScaleDrawer) && !mTransform3dDrawer) { int maxLeft = mDrawerWidth / DRAWER_CONTENT_MOVE_PROPORTION; int negativePaddingLeft = -1 * (int) (maxLeft - (Float.valueOf(position) / DRAWER_CONTENT_MOVE_PROPORTION)); setLeftPadding(mViewWidth, negativePaddingLeft); } if (mFadeDrawer) { setAlpha(position); } if (mScaleDrawer && !mTransform3dDrawer) { setScale(position); } if (mTransform3dDrawer) { setTransform3d(position); } } private void setLeftPadding(View view, int left) { view.setPadding(left, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); } private void setScale(int position) { float scale = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.2f + 0.8f; mViewAlphaProxy.setScaleX(scale); mViewAlphaProxy.setScaleY(scale); } @TargetApi(11) private void setTransform3d(int position) { int maxLeft = Math.round(mDrawerWidth * 0.9f); int negativePaddingLeft = -1 * (int) (maxLeft - (Float.valueOf(position) * 0.9f)); setLeftPadding(mViewWidth, negativePaddingLeft); float scale = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.3f + 0.7f; mViewAlphaProxy.setScaleX(scale); mViewAlphaProxy.setScaleY(scale); float rotate = (Float.valueOf(position) / Float.valueOf(mDrawerWidth)) * 0.9f + 0.1f; mViewAlpha.setRotationY(-45 + (rotate * 45)); } private void setWidth(View view, int width) { ViewGroup.LayoutParams params = view.getLayoutParams(); params.width = width; view.setLayoutParams(params); } } }