Created
October 18, 2017 02:14
-
-
Save chibatching/a07ad2ecf413c5c5ac14b0a8ab8452f9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.Context | |
import android.support.design.widget.CoordinatorLayout | |
import android.support.v4.view.NestedScrollingChild | |
import android.support.v4.view.NestedScrollingChildHelper | |
import android.util.AttributeSet | |
import android.view.View | |
/** | |
* Propagate nested scroll event to in/out nested coordinator layout | |
* Based on https://stackoverflow.com/questions/34181372/coordinatorlayout-inside-another-coordinatorlayout | |
*/ | |
class NestedCoordinatorLayout | |
@JvmOverloads constructor(context: Context, | |
attrs: AttributeSet? = null, | |
defStyleAttr: Int = -1) | |
: CoordinatorLayout(context, attrs, defStyleAttr), NestedScrollingChild { | |
private val childHelper: NestedScrollingChildHelper = NestedScrollingChildHelper(this) | |
init { | |
isNestedScrollingEnabled = true | |
} | |
override fun onStartNestedScroll(child: View, target: View, axes: Int, type: Int): Boolean { | |
/* Enable the scrolling behavior of our own children */ | |
val tHandled = super.onStartNestedScroll(child, target, axes, type) | |
/* Enable the scrolling behavior of the parent's other children */ | |
return childHelper.startNestedScroll(axes, type) || tHandled | |
} | |
override fun onStopNestedScroll(target: View, type: Int) { | |
/* Disable the scrolling behavior of our own children */ | |
super.onStopNestedScroll(target, type) | |
/* Disable the scrolling behavior of the parent's other children */ | |
childHelper.stopNestedScroll(type) | |
} | |
override fun onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray?, type: Int) { | |
val tConsumed = Array(2) { IntArray(2) } | |
super.onNestedPreScroll(target, dx, dy, tConsumed[0], type) | |
childHelper.dispatchNestedPreScroll(dx, dy, tConsumed[1], null, type) | |
consumed?.set(0, tConsumed[0][0] + tConsumed[1][0]) | |
consumed?.set(1, tConsumed[0][1] + tConsumed[1][1]) | |
} | |
override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int) { | |
super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type) | |
childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null, type) | |
} | |
override fun onNestedPreFling(target: View, velocityX: Float, velocityY: Float): Boolean { | |
val tHandled = super.onNestedPreFling(target, velocityX, velocityY) | |
return dispatchNestedPreFling(velocityX, velocityY) || tHandled | |
} | |
override fun onNestedFling(target: View, velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { | |
val tHandled = super.onNestedFling(target, velocityX, velocityY, consumed) | |
return dispatchNestedFling(velocityX, velocityY, consumed) || tHandled | |
} | |
override fun setNestedScrollingEnabled(enabled: Boolean) { | |
childHelper.isNestedScrollingEnabled = enabled | |
} | |
override fun isNestedScrollingEnabled(): Boolean { | |
return childHelper.isNestedScrollingEnabled | |
} | |
override fun startNestedScroll(axes: Int): Boolean { | |
return childHelper.startNestedScroll(axes) | |
} | |
override fun stopNestedScroll() { | |
childHelper.stopNestedScroll() | |
} | |
override fun hasNestedScrollingParent(): Boolean { | |
return childHelper.hasNestedScrollingParent() | |
} | |
override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, | |
dyUnconsumed: Int, offsetInWindow: IntArray?): Boolean { | |
return childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, | |
dyUnconsumed, offsetInWindow) | |
} | |
override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?): Boolean { | |
return childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow) | |
} | |
override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { | |
return childHelper.dispatchNestedFling(velocityX, velocityY, consumed) | |
} | |
override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean { | |
return childHelper.dispatchNestedPreFling(velocityX, velocityY) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment