diff --git a/library/build.gradle b/library/build.gradle index e2a5bf978..cbb194bdf 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:0.4.+' + classpath 'com.android.tools.build:gradle:0.12.+' } } apply plugin: 'android-library' @@ -13,8 +13,8 @@ dependencies { } android { - compileSdkVersion 17 - buildToolsVersion "17.0.0" + compileSdkVersion 19 + buildToolsVersion "19.1.0" defaultConfig { minSdkVersion 7 diff --git a/library/library.iml b/library/library.iml index a6e3c8f47..09ae8ea39 100644 --- a/library/library.iml +++ b/library/library.iml @@ -1,19 +1,64 @@ - + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + diff --git a/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewAbove.java b/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewAbove.java index fa73ef05b..ea59048dd 100644 --- a/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewAbove.java +++ b/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewAbove.java @@ -98,8 +98,19 @@ public float getInterpolation(float t) { private OnOpenedListener mOpenedListener; private List mIgnoredViews = new ArrayList(); + private SlidingMenu.CanvasTransformer mTransformer; + private SlidingMenu.OnOpeningListener mOnOpeningListener; + private SlidingMenu.OnOpeningListener mSecondaryOnOpeningListener; - // private int mScrollState = SCROLL_STATE_IDLE; + public void setOnOpeningListener(SlidingMenu.OnOpeningListener onOpeningListener) { + mOnOpeningListener = onOpeningListener; + } + + public void setSecondaryOnOpeningListener(SlidingMenu.OnOpeningListener onOpeningListener) { + mSecondaryOnOpeningListener = onOpeningListener; + } + + // private int mScrollState = SCROLL_STATE_IDLE; /** * Callback interface for responding to changing state of the selected page. @@ -157,6 +168,10 @@ public CustomViewAbove(Context context, AttributeSet attrs) { initCustomViewAbove(); } + public void setCanvasTransformer(SlidingMenu.CanvasTransformer t) { + mTransformer = t; + } + void initCustomViewAbove() { setWillNotDraw(false); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); @@ -575,7 +590,7 @@ public int getTouchMode() { private boolean thisTouchAllowed(MotionEvent ev) { int x = (int) (ev.getX() + mScrollX); if (isMenuOpen()) { - return mViewBehind.menuOpenTouchAllowed(mContent, mCurItem, x); + return mViewBehind.menuOpenTouchAllowed(mContent, mCurItem, x, ev.getY()); } else { switch (mTouchMode) { case SlidingMenu.TOUCHMODE_FULLSCREEN: @@ -642,7 +657,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { if (thisTouchAllowed(ev)) { mIsBeingDragged = false; mIsUnableToDrag = false; - if (isMenuOpen() && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX)) { + if (isMenuOpen() && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX, ev.getY())) { mQuickReturn = true; } } else { @@ -744,7 +759,7 @@ public boolean onTouchEvent(MotionEvent ev) { } mActivePointerId = INVALID_POINTER; endDrag(); - } else if (mQuickReturn && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX)) { + } else if (mQuickReturn && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX, ev.getY())) { // close the menu setCurrentItem(1); endDrag(); @@ -789,6 +804,7 @@ private void determineDrag(MotionEvent ev) { startDrag(); mLastMotionX = x; mLastMotionY = y; + if (!isMenuOpen()) isOpening(dx == xDiff); setScrollingCacheEnabled(true); // TODO add back in touch slop check } else if (xDiff > mTouchSlop) { @@ -796,7 +812,21 @@ private void determineDrag(MotionEvent ev) { } } - @Override + private void isOpening(boolean isMovingLeftToRight) { + if (mViewBehind.getMode() == SlidingMenu.LEFT && isMovingLeftToRight && mOnOpeningListener != null) { + mOnOpeningListener.onOpening(); + }else if (mViewBehind.getMode() == SlidingMenu.RIGHT && !isMovingLeftToRight && mOnOpeningListener != null) { + mOnOpeningListener.onOpening(); + }else if (mViewBehind.getMode() == SlidingMenu.LEFT_RIGHT) { + if (isMovingLeftToRight && mOnOpeningListener != null) { + mOnOpeningListener.onOpening(); + }else if (!isMovingLeftToRight && mSecondaryOnOpeningListener != null) { + mSecondaryOnOpeningListener.onOpening(); + } + } + } + + @Override public void scrollTo(int x, int y) { super.scrollTo(x, y); mScrollX = x; @@ -824,7 +854,13 @@ protected float getPercentOpen() { @Override protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); + if (mTransformer != null) { + canvas.save(); + mTransformer.transformCanvas(canvas, getPercentOpen()); + super.dispatchDraw(canvas); + canvas.restore(); + } else + super.dispatchDraw(canvas); // Draw the margin drawable if needed. mViewBehind.drawShadow(mContent, canvas); mViewBehind.drawFade(mContent, canvas, getPercentOpen()); diff --git a/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewBehind.java b/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewBehind.java index fa0544d5b..dd2f2e60b 100644 --- a/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewBehind.java +++ b/library/src/com/jeremyfeinstein/slidingmenu/lib/CustomViewBehind.java @@ -30,8 +30,9 @@ public class CustomViewBehind extends ViewGroup { private int mWidthOffset; private CanvasTransformer mTransformer; private boolean mChildrenEnabled; + private SlidingMenu.TouchRangeListener mTouchRangeListener; - public CustomViewBehind(Context context) { + public CustomViewBehind(Context context) { this(context, null); } @@ -299,20 +300,22 @@ public void setTouchMode(int i) { mTouchMode = i; } - public boolean menuOpenTouchAllowed(View content, int currPage, float x) { + public boolean menuOpenTouchAllowed(View content, int currPage, float x, float y) { switch (mTouchMode) { case SlidingMenu.TOUCHMODE_FULLSCREEN: return true; case SlidingMenu.TOUCHMODE_MARGIN: - return menuTouchInQuickReturn(content, currPage, x); + return menuTouchInQuickReturn(content, currPage, x, y); } return false; } - public boolean menuTouchInQuickReturn(View content, int currPage, float x) { + public boolean menuTouchInQuickReturn(View content, int currPage, float x, float y) { if (mMode == SlidingMenu.LEFT || (mMode == SlidingMenu.LEFT_RIGHT && currPage == 0)) { + if (mTouchRangeListener != null) return mTouchRangeListener.isInTouchRange((int)x, (int)y); return x >= content.getLeft(); } else if (mMode == SlidingMenu.RIGHT || (mMode == SlidingMenu.LEFT_RIGHT && currPage == 2)) { + if (mTouchRangeListener != null) return mTouchRangeListener.isInTouchRange((int)x, (int)y); return x <= content.getRight(); } return false; @@ -436,4 +439,7 @@ public void setSelectorBitmap(Bitmap b) { refreshDrawableState(); } + public void setTouchRangeListener(SlidingMenu.TouchRangeListener touchRangeListener) { + mTouchRangeListener = touchRangeListener; + } } diff --git a/library/src/com/jeremyfeinstein/slidingmenu/lib/SlidingMenu.java b/library/src/com/jeremyfeinstein/slidingmenu/lib/SlidingMenu.java index 8b88708b9..4ca814d1d 100644 --- a/library/src/com/jeremyfeinstein/slidingmenu/lib/SlidingMenu.java +++ b/library/src/com/jeremyfeinstein/slidingmenu/lib/SlidingMenu.java @@ -73,8 +73,28 @@ public class SlidingMenu extends RelativeLayout { private OnOpenListener mSecondaryOpenListner; private OnCloseListener mCloseListener; + private OnOpeningListener mOpeningListener; + private OnOpeningListener mSecondaryOpeningListener; - /** + public void setAboveCanvasTransformer(CanvasTransformer canvasTransformer) { + mViewAbove.setCanvasTransformer(canvasTransformer); + } + + public void setOnOpeningListener(OnOpeningListener onOpeningListener) { + mOpeningListener = onOpeningListener; + mViewAbove.setOnOpeningListener(onOpeningListener); + } + + public void setSecondaryOnOpeningListner(OnOpeningListener onOpeningListener) { + mSecondaryOpeningListener = onOpeningListener; + mViewAbove.setSecondaryOnOpeningListener(onOpeningListener); + } + + public void setTouchRangeListener(TouchRangeListener touchRangeListener) { + mViewBehind.setTouchRangeListener(touchRangeListener); + } + + /** * The listener interface for receiving onOpen events. * The class that is interested in processing a onOpen * event implements this interface, and the object created @@ -490,6 +510,7 @@ public void showMenu() { * @param animate true to animate the transition, false to ignore animation */ public void showMenu(boolean animate) { + if (mOpeningListener != null) mOpeningListener.onOpening(); mViewAbove.setCurrentItem(0, animate); } @@ -508,6 +529,7 @@ public void showSecondaryMenu() { * @param animate true to animate the transition, false to ignore animation */ public void showSecondaryMenu(boolean animate) { + if (mSecondaryOpeningListener != null) mSecondaryOpeningListener.onOpening(); mViewAbove.setCurrentItem(2, animate); } @@ -547,6 +569,23 @@ public void toggle(boolean animate) { } } + public void toggleSecondaryMenu() { + toggleSecondaryMenu(true); + } + + /** + * Toggle the SlidingMenu. If it is open, it will be closed, and vice versa. + * + * @param animate true to animate the transition, false to ignore animation + */ + public void toggleSecondaryMenu(boolean animate) { + if (isMenuShowing()) { + showContent(animate); + } else { + showSecondaryMenu(animate); + } + } + /** * Checks if is the behind view showing. * @@ -922,7 +961,15 @@ public void setOnClosedListener(OnClosedListener listener) { mViewAbove.setOnClosedListener(listener); } - public static class SavedState extends BaseSavedState { + public interface OnOpeningListener { + void onOpening(); + } + + public interface TouchRangeListener { + boolean isInTouchRange(int x, int y); + } + + public static class SavedState extends BaseSavedState { private final int mItem;