From 80738832f6d943caaeb600ced74a1d825693abdc Mon Sep 17 00:00:00 2001 From: Yunseok Choi Date: Wed, 6 May 2015 13:18:34 +0900 Subject: [PATCH 1/2] Add Top edge tracking mode. --- .../swipebacklayout/lib/SwipeBackLayout.java | 50 ++++++++++++++++-- .../main/res/drawable-xhdpi/shadow_top.png | Bin 0 -> 616 bytes library/src/main/res/values/attrs.xml | 1 + library/src/main/res/values/styles.xml | 1 + 4 files changed, 49 insertions(+), 3 deletions(-) mode change 100644 => 100755 library/src/main/java/me/imid/swipebacklayout/lib/SwipeBackLayout.java create mode 100644 library/src/main/res/drawable-xhdpi/shadow_top.png mode change 100644 => 100755 library/src/main/res/values/attrs.xml mode change 100644 => 100755 library/src/main/res/values/styles.xml diff --git a/library/src/main/java/me/imid/swipebacklayout/lib/SwipeBackLayout.java b/library/src/main/java/me/imid/swipebacklayout/lib/SwipeBackLayout.java old mode 100644 new mode 100755 index 7a33faf..b3c0426 --- a/library/src/main/java/me/imid/swipebacklayout/lib/SwipeBackLayout.java +++ b/library/src/main/java/me/imid/swipebacklayout/lib/SwipeBackLayout.java @@ -8,6 +8,7 @@ import android.graphics.drawable.Drawable; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -41,10 +42,12 @@ public class SwipeBackLayout extends FrameLayout { */ public static final int EDGE_BOTTOM = ViewDragHelper.EDGE_BOTTOM; + public static final int EDGE_TOP = ViewDragHelper.EDGE_TOP; + /** * Edge flag set indicating all edges should be affected. */ - public static final int EDGE_ALL = EDGE_LEFT | EDGE_RIGHT | EDGE_BOTTOM; + public static final int EDGE_ALL = EDGE_LEFT | EDGE_RIGHT | EDGE_BOTTOM | EDGE_TOP; /** * A view is not currently being dragged or animating as a result of a @@ -72,7 +75,7 @@ public class SwipeBackLayout extends FrameLayout { private static final int OVERSCROLL_DISTANCE = 10; private static final int[] EDGE_FLAGS = { - EDGE_LEFT, EDGE_RIGHT, EDGE_BOTTOM, EDGE_ALL + EDGE_LEFT, EDGE_RIGHT, EDGE_BOTTOM, EDGE_TOP, EDGE_ALL }; private int mEdgeFlag; @@ -108,6 +111,8 @@ public class SwipeBackLayout extends FrameLayout { private Drawable mShadowBottom; + private Drawable mShadowTop; + private float mScrimOpacity; private int mScrimColor = DEFAULT_SCRIM_COLOR; @@ -148,9 +153,12 @@ public SwipeBackLayout(Context context, AttributeSet attrs, int defStyle) { R.drawable.shadow_right); int shadowBottom = a.getResourceId(R.styleable.SwipeBackLayout_shadow_bottom, R.drawable.shadow_bottom); + int shadowTop = a.getResourceId(R.styleable.SwipeBackLayout_shadow_top, + R.drawable.shadow_top); setShadow(shadowLeft, EDGE_LEFT); setShadow(shadowRight, EDGE_RIGHT); setShadow(shadowBottom, EDGE_BOTTOM); + setShadow(shadowTop, EDGE_TOP); a.recycle(); final float density = getResources().getDisplayMetrics().density; final float minVel = MIN_FLING_VELOCITY * density; @@ -278,6 +286,7 @@ public static interface SwipeListener { * @see #EDGE_LEFT * @see #EDGE_RIGHT * @see #EDGE_BOTTOM + * @see #EDGE_TOP */ public void onEdgeTouch(int edgeFlag); @@ -308,6 +317,7 @@ public void setScrollThresHold(float threshold) { * @see #EDGE_LEFT * @see #EDGE_RIGHT * @see #EDGE_BOTTOM + * @see #EDGE_TOP */ public void setShadow(Drawable shadow, int edgeFlag) { if ((edgeFlag & EDGE_LEFT) != 0) { @@ -316,6 +326,8 @@ public void setShadow(Drawable shadow, int edgeFlag) { mShadowRight = shadow; } else if ((edgeFlag & EDGE_BOTTOM) != 0) { mShadowBottom = shadow; + } else if ((edgeFlag & EDGE_TOP) != 0) { + mShadowTop = shadow; } invalidate(); } @@ -328,6 +340,7 @@ public void setShadow(Drawable shadow, int edgeFlag) { * @see #EDGE_LEFT * @see #EDGE_RIGHT * @see #EDGE_BOTTOM + * @see #EDGE_TOP */ public void setShadow(int resId, int edgeFlag) { setShadow(getResources().getDrawable(resId), edgeFlag); @@ -350,6 +363,9 @@ public void scrollToFinishActivity() { } else if ((mEdgeFlag & EDGE_BOTTOM) != 0) { top = -childHeight - mShadowBottom.getIntrinsicHeight() - OVERSCROLL_DISTANCE; mTrackingEdge = EDGE_BOTTOM; + } else if ((mEdgeFlag & EDGE_TOP) != 0) { + top = childWidth + mShadowLeft.getIntrinsicWidth() + OVERSCROLL_DISTANCE; + mTrackingEdge = EDGE_TOP; } mDragHelper.smoothSlideViewTo(mContentView, left, top); @@ -420,6 +436,8 @@ private void drawScrim(Canvas canvas, View child) { canvas.clipRect(child.getRight(), 0, getRight(), getHeight()); } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { canvas.clipRect(child.getLeft(), child.getBottom(), getRight(), getHeight()); + } else if ((mTrackingEdge & EDGE_TOP) != 0) { + canvas.clipRect(child.getLeft(), 0, getRight(), child.getTop() + getStatusBarHeight()); } canvas.drawColor(color); } @@ -448,6 +466,22 @@ private void drawShadow(Canvas canvas, View child) { mShadowBottom.setAlpha((int) (mScrimOpacity * FULL_ALPHA)); mShadowBottom.draw(canvas); } + + if ((mEdgeFlag & EDGE_TOP) != 0) { + mShadowTop.setBounds(childRect.left, childRect.top - mShadowTop.getIntrinsicHeight(), childRect.right, + childRect.top + getStatusBarHeight()); + mShadowTop.setAlpha((int) (mScrimOpacity * FULL_ALPHA)); + mShadowTop.draw(canvas); + } + } + + private int getStatusBarHeight() { + int result = 0; + int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = getResources().getDimensionPixelSize(resourceId); + } + return result; } public void attachToActivity(Activity activity) { @@ -488,6 +522,8 @@ public boolean tryCaptureView(View view, int i) { mTrackingEdge = EDGE_RIGHT; } else if (mDragHelper.isEdgeTouched(EDGE_BOTTOM, i)) { mTrackingEdge = EDGE_BOTTOM; + } else if (mDragHelper.isEdgeTouched(EDGE_TOP, i)) { + mTrackingEdge = EDGE_TOP; } if (mListeners != null && !mListeners.isEmpty()) { for (SwipeListener listener : mListeners) { @@ -506,7 +542,7 @@ public int getViewHorizontalDragRange(View child) { @Override public int getViewVerticalDragRange(View child) { - return mEdgeFlag & EDGE_BOTTOM; + return mEdgeFlag & (EDGE_BOTTOM | EDGE_TOP); } @Override @@ -521,6 +557,9 @@ public void onViewPositionChanged(View changedView, int left, int top, int dx, i } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { mScrollPercent = Math.abs((float) top / (mContentView.getHeight() + mShadowBottom.getIntrinsicHeight())); + } else if ((mTrackingEdge & EDGE_TOP) != 0) { + mScrollPercent = Math.abs((float) top + / (mContentView.getHeight() + mShadowTop.getIntrinsicHeight())); } mContentLeft = left; mContentTop = top; @@ -558,6 +597,9 @@ public void onViewReleased(View releasedChild, float xvel, float yvel) { } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { top = yvel < 0 || yvel == 0 && mScrollPercent > mScrollThreshold ? -(childHeight + mShadowBottom.getIntrinsicHeight() + OVERSCROLL_DISTANCE) : 0; + } else if ((mTrackingEdge & EDGE_TOP) != 0) { + top = yvel > 0 || yvel == 0 && mScrollPercent > mScrollThreshold ? childHeight + + mShadowBottom.getIntrinsicHeight() + OVERSCROLL_DISTANCE : 0; } mDragHelper.settleCapturedViewAt(left, top); @@ -580,6 +622,8 @@ public int clampViewPositionVertical(View child, int top, int dy) { int ret = 0; if ((mTrackingEdge & EDGE_BOTTOM) != 0) { ret = Math.min(0, Math.max(top, -child.getHeight())); + } else if ((mTrackingEdge & EDGE_TOP) != 0) { + ret = Math.min(child.getHeight(), Math.max(top, 0)); } return ret; } diff --git a/library/src/main/res/drawable-xhdpi/shadow_top.png b/library/src/main/res/drawable-xhdpi/shadow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8a96b32a083269954f0d9a3739eea4f00b871f GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBP!3HEV53W@NQjEnx?oJHr&dIz4aukw1f_xbm zs?-=58d?|_egTCVUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hv%n*=n1O*?7=#%aX3dcR z8Wx!u5>XQ2>tmIipR1RclAn~SSCLx)RL#I(Q(*;U=BAb;Dpcg=|?L9&C18K8MsJfgxGr>EalY!TR=QH>ZOlk8|Mt zsE_yLf?0}jFZ&0U4{UP+PlSDM zsHs&x@Jaq*?*Y@s)&(qQEUnoh|K1#XLp2W|1sSb)#Pgg&ebxsLQ0QcR(ga7~l literal 0 HcmV?d00001 diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml old mode 100644 new mode 100755 index dbc484f..4df08a9 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -11,6 +11,7 @@ + diff --git a/library/src/main/res/values/styles.xml b/library/src/main/res/values/styles.xml old mode 100644 new mode 100755 index 39c12f6..e1646ed --- a/library/src/main/res/values/styles.xml +++ b/library/src/main/res/values/styles.xml @@ -6,6 +6,7 @@ @drawable/shadow_left @drawable/shadow_right @drawable/shadow_bottom + @drawable/shadow_top \ No newline at end of file From 48ffeb7dde2ca38accfeff0c1b938166e454696d Mon Sep 17 00:00:00 2001 From: Yunseok Choi Date: Wed, 6 May 2015 14:07:26 +0900 Subject: [PATCH 2/2] Add missing top edge_flag attribute. --- library/src/main/res/values/attrs.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 4df08a9..d8525d8 100755 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -6,7 +6,8 @@ - + +