diff options
author | Allan Wang <me@allanwang.ca> | 2019-09-22 22:10:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-22 22:10:16 -0700 |
commit | cd4799b7b93c542e1d8204a32b6d43df7e5d1191 (patch) | |
tree | 70945ddab3e46fae987943fb66af9249834c8fde /core | |
parent | bfba246d84aa6a22bc02837f9fcbd97780867d10 (diff) | |
parent | 996f111dbd36b636d004f0706b88c5b1e31af246 (diff) | |
download | kau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.tar.gz kau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.tar.bz2 kau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.zip |
Merge pull request #222 from AllanWang/swipe-enhancement
Swipe enhancement
Diffstat (limited to 'core')
3 files changed, 35 insertions, 29 deletions
diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt index 0cb6935..a8c71a4 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt @@ -34,8 +34,12 @@ internal object SwipeBackHelper { private operator fun get(activity: Activity): SwipeBackPage? = pageStack.firstOrNull { it.activityRef.get() === activity } - fun onCreate(activity: Activity, builder: SwipeBackContract.() -> Unit = {}) { - val page = this[activity] ?: pageStack.push(SwipeBackPage(activity).apply { builder() }) + fun onCreate( + activity: Activity, + builder: SwipeBackContract.() -> Unit = {} + ): SwipeBackContract { + val swipeBackPage = SwipeBackPage(activity).apply(builder) + val page = this[activity] ?: pageStack.push(swipeBackPage) val startAnimation: Int = when (page.edgeFlag) { SWIPE_EDGE_LEFT -> R.anim.kau_slide_in_right SWIPE_EDGE_RIGHT -> R.anim.kau_slide_in_left @@ -45,6 +49,7 @@ internal object SwipeBackHelper { activity.overridePendingTransition(startAnimation, 0) page.onPostCreate() KL.v { "KauSwipe onCreate ${activity.localClassName}" } + return swipeBackPage } fun onDestroy(activity: Activity) { @@ -73,13 +78,17 @@ internal object SwipeBackHelper { * * Lastly, don't forget to call [kauSwipeOnDestroy] as well when the activity is destroyed. */ -fun Activity.kauSwipeOnCreate(builder: SwipeBackContract.() -> Unit = {}) = SwipeBackHelper.onCreate(this, builder) +fun Activity.kauSwipeOnCreate(builder: SwipeBackContract.() -> Unit = {}): SwipeBackContract = + SwipeBackHelper.onCreate(this, builder) /** * Deprecated as onPostCreate seems unreliable. * We will instead initialize everything during [kauSwipeOnCreate] */ -@Deprecated(level = DeprecationLevel.WARNING, message = "All functionality has been moved to kauSwipeOnCreate") +@Deprecated( + level = DeprecationLevel.WARNING, + message = "All functionality has been moved to kauSwipeOnCreate" +) fun Activity.kauSwipeOnPostCreate() { } diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt index 921cd1f..bf6d09d 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt @@ -30,6 +30,9 @@ import ca.allanwang.kau.utils.adjustAlpha import ca.allanwang.kau.utils.navigationBarColor import ca.allanwang.kau.utils.statusBarColor import java.lang.ref.WeakReference +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min /** * The layout that handles all the touch events @@ -165,12 +168,8 @@ internal class SwipeBackLayout @JvmOverloads constructor( init { dragHelper = ViewDragHelper.create(this, ViewDragCallback()) - val density = resources.displayMetrics.density - val minVel = MIN_FLING_VELOCITY * density // allow touch from anywhere on the screen - edgeSize = Math.max(resources.displayMetrics.widthPixels, resources.displayMetrics.heightPixels) - minVelocity = minVel -// maxVelocity = 2.5f * minVel + edgeSize = max(resources.displayMetrics.widthPixels, resources.displayMetrics.heightPixels) edgeFlag = edgeFlag sensitivity = 0.3f addListener(chromeFadeListener) @@ -244,19 +243,18 @@ internal class SwipeBackLayout @JvmOverloads constructor( } override fun onInterceptTouchEvent(event: MotionEvent): Boolean { - if (!swipeEnabled || disallowIntercept) { - return false - } + if (!swipeEnabled || disallowIntercept) return false return try { dragHelper.shouldInterceptTouchEvent(event) } catch (e: Exception) { false + } } @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { - if (!swipeEnabled) return false + if (!swipeEnabled || disallowIntercept) return false try { dragHelper.processTouchEvent(event) } catch (e: Exception) { @@ -372,10 +370,8 @@ internal class SwipeBackLayout @JvmOverloads constructor( val contentView = contentViewRef.get() ?: return KL.e { "KauSwipe cannot change view position as contentView is null; is onPostCreate called?" } // make sure that we are using the proper axis - scrollPercent = Math.abs( - if (horizontal) left.toFloat() / contentView.width - else (top.toFloat() / contentView.height) - ) + scrollPercent = abs(if (horizontal) left.toFloat() / contentView.width + else (top.toFloat() / contentView.height)) contentOffset = if (horizontal) left else top invalidate() if (scrollPercent < scrollThreshold && !isScrollOverValid) @@ -400,10 +396,10 @@ internal class SwipeBackLayout @JvmOverloads constructor( var result = Pair(0, 0) if (scrollPercent <= scrollThreshold) { // threshold not met; check velocities - if ((edgeFlag == SWIPE_EDGE_LEFT && xvel > MIN_FLING_VELOCITY) || - (edgeFlag == SWIPE_EDGE_RIGHT && xvel < -MIN_FLING_VELOCITY) || - (edgeFlag == SWIPE_EDGE_TOP && yvel > MIN_FLING_VELOCITY) || - (edgeFlag == SWIPE_EDGE_BOTTOM && yvel < -MIN_FLING_VELOCITY) + if ((edgeFlag == SWIPE_EDGE_LEFT && xvel > minVelocity) || + (edgeFlag == SWIPE_EDGE_RIGHT && xvel < -minVelocity) || + (edgeFlag == SWIPE_EDGE_TOP && yvel > minVelocity) || + (edgeFlag == SWIPE_EDGE_BOTTOM && yvel < -minVelocity) ) result = exitCaptureOffsets(edgeFlag, releasedChild) } else { @@ -428,26 +424,22 @@ internal class SwipeBackLayout @JvmOverloads constructor( override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int { return when (edgeFlag) { - SWIPE_EDGE_RIGHT -> Math.min(0, Math.max(left, -child.width)) - SWIPE_EDGE_LEFT -> Math.min(child.width, Math.max(left, 0)) + SWIPE_EDGE_RIGHT -> min(0, max(left, -child.width)) + SWIPE_EDGE_LEFT -> min(child.width, max(left, 0)) else -> 0 } } override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int { return when (edgeFlag) { - SWIPE_EDGE_BOTTOM -> Math.min(0, Math.max(top, -child.height)) - SWIPE_EDGE_TOP -> Math.min(child.height, Math.max(top, 0)) + SWIPE_EDGE_BOTTOM -> min(0, max(top, -child.height)) + SWIPE_EDGE_TOP -> min(child.height, max(top, 0)) else -> 0 } } } companion object { - /** - * Minimum velocity that will be detected as a fling - */ - const val MIN_FLING_VELOCITY = 400 // dips per second const val DEFAULT_SCRIM_COLOR = 0x99000000.toInt() diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt index bc5b459..c85625a 100644 --- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt +++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt @@ -75,6 +75,7 @@ internal interface SwipeBackContractInternal : SwipeBackContract { interface SwipeBackContract { /** * Toggle main touch intercept + * Disabling will remove the swipe back handler */ var swipeEnabled: Boolean /** @@ -91,6 +92,10 @@ interface SwipeBackContract { * Set the scrolling threshold for wish a page is deemed closing */ var scrollThreshold: Float + /** + * Toggle main touch intercept + * Disabling will just ignore touch events, but the handler will remain attached + */ var disallowIntercept: Boolean /** * Set the min velocity of the view drag helper |