Skip to content

Instantly share code, notes, and snippets.

@chibatching
Created October 18, 2017 02:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chibatching/a07ad2ecf413c5c5ac14b0a8ab8452f9 to your computer and use it in GitHub Desktop.
Save chibatching/a07ad2ecf413c5c5ac14b0a8ab8452f9 to your computer and use it in GitHub Desktop.
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