Created
November 15, 2017 02:30
-
-
Save kubode/7b5e49f70498436f6ffc0afad18b14a2 to your computer and use it in GitHub Desktop.
Nested scroll CoordinatorLayout
This file contains hidden or 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.NestedScrollingChild2 | |
import android.support.v4.view.NestedScrollingChildHelper | |
import android.util.AttributeSet | |
import android.view.View | |
class NestedScrollCoordinatorLayout @JvmOverloads constructor( | |
context: Context, | |
attrs: AttributeSet? = null | |
) : CoordinatorLayout(context, attrs), NestedScrollingChild2 { | |
private val helper = NestedScrollingChildHelper(this) | |
init { | |
isNestedScrollingEnabled = true | |
} | |
// region NestedScrollingChild2 | |
override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?, type: Int): Boolean { | |
return helper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow, type) | |
} | |
override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?): Boolean { | |
return helper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow) | |
} | |
override fun isNestedScrollingEnabled(): Boolean { | |
return helper.isNestedScrollingEnabled | |
} | |
override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?, type: Int): Boolean { | |
return helper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type) | |
} | |
override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?): Boolean { | |
return helper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow) | |
} | |
override fun stopNestedScroll(type: Int) { | |
helper.stopNestedScroll(type) | |
} | |
override fun stopNestedScroll() { | |
helper.stopNestedScroll() | |
} | |
override fun hasNestedScrollingParent(type: Int): Boolean { | |
return helper.hasNestedScrollingParent(type) | |
} | |
override fun hasNestedScrollingParent(): Boolean { | |
return helper.hasNestedScrollingParent() | |
} | |
override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean { | |
return helper.dispatchNestedPreFling(velocityX, velocityY) | |
} | |
override fun setNestedScrollingEnabled(enabled: Boolean) { | |
helper.isNestedScrollingEnabled = enabled | |
} | |
override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { | |
return helper.dispatchNestedFling(velocityX, velocityY, consumed) | |
} | |
override fun startNestedScroll(axes: Int, type: Int): Boolean { | |
return helper.startNestedScroll(axes, type) | |
} | |
override fun startNestedScroll(axes: Int): Boolean { | |
return helper.startNestedScroll(axes) | |
} | |
// endregion | |
// region NestedScrollingParent2 | |
override fun onStartNestedScroll(child: View, target: View, axes: Int, type: Int): Boolean { | |
val superResult = super.onStartNestedScroll(child, target, axes, type) | |
return startNestedScroll(axes, type) || superResult | |
} | |
override fun onStartNestedScroll(child: View, target: View, axes: Int): Boolean { | |
val superResult = super.onStartNestedScroll(child, target, axes) | |
return startNestedScroll(axes) || superResult | |
} | |
override fun onNestedFling(target: View, velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { | |
val superResult = super.onNestedFling(target, velocityX, velocityY, consumed) | |
return dispatchNestedFling(velocityX, velocityY, consumed) || superResult | |
} | |
override fun onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray?, type: Int) { | |
val superConsumed = intArrayOf(0, 0) | |
super.onNestedPreScroll(target, dx, dy, superConsumed, type) | |
val thisConsumed = intArrayOf(0, 0) | |
dispatchNestedPreScroll(dx, dy, thisConsumed, null) | |
consumed?.let { | |
it[0] = superConsumed[0] + thisConsumed[0] | |
it[1] = superConsumed[1] + thisConsumed[1] | |
} | |
} | |
override fun onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray) { | |
val superConsumed = intArrayOf(0, 0) | |
super.onNestedPreScroll(target, dx, dy, superConsumed) | |
val thisConsumed = intArrayOf(0, 0) | |
dispatchNestedPreScroll(dx, dy, thisConsumed, null) | |
consumed[0] = superConsumed[0] + thisConsumed[0] | |
consumed[1] = superConsumed[1] + thisConsumed[1] | |
} | |
override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, type: Int) { | |
super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type) | |
dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null, type) | |
} | |
override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int) { | |
super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed) | |
dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null) | |
} | |
override fun onNestedPreFling(target: View, velocityX: Float, velocityY: Float): Boolean { | |
val superResult = super.onNestedPreFling(target, velocityX, velocityY) | |
return dispatchNestedPreFling(velocityX, velocityY) || superResult | |
} | |
override fun onStopNestedScroll(target: View, type: Int) { | |
super.onStopNestedScroll(target, type) | |
stopNestedScroll(type) | |
} | |
override fun onStopNestedScroll(target: View) { | |
super.onStopNestedScroll(target) | |
stopNestedScroll() | |
} | |
// endregion | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment