takahirom / webview-in-coordinatorlayout

248 stars 71 forks source link

I wrote NestedWebView with Kotlin and fix some codes. #13

Open ByunghooLimCn opened 6 years ago

ByunghooLimCn commented 6 years ago

package input.your.package.name

/*

import android.annotation.SuppressLint import android.content.Context import android.support.v4.view.NestedScrollingChild import android.support.v4.view.NestedScrollingChildHelper import android.support.v4.view.ViewCompat import android.util.AttributeSet import android.view.MotionEvent import android.view.MotionEvent.* import android.webkit.WebView

open class NestedWebView(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.webViewStyle) : WebView(context, attrs, defStyleAttr), NestedScrollingChild { private val mScrollOffset = IntArray(2) private val mScrollConsumed = IntArray(2) private val mChildHelper = NestedScrollingChildHelper(rootView) private var mLastY: Float = 0F private var mNestedOffsetY: Float = 0F

init {
    isNestedScrollingEnabled = true
}

@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(ev: MotionEvent): Boolean {
    val event = obtain(ev)
    var returnValue = false

    event.offsetLocation(0f, mNestedOffsetY)

    when (ev.action) {
        ACTION_DOWN -> {
            returnValue = super.onTouchEvent(event)
            mLastY = event.y
            // start NestedScroll
            startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL)
        }
        ACTION_MOVE -> {
            var deltaY = mLastY - event.y
            // NestedPreScroll
            if (dispatchNestedPreScroll(0, deltaY.toInt(), mScrollConsumed, mScrollOffset)) {
                deltaY -= mScrollConsumed[1]
                mLastY = event.y - mScrollOffset[1]
                event.offsetLocation(0f, (-mScrollOffset[1]).toFloat())
                mNestedOffsetY += mScrollOffset[1]
            }

            returnValue = super.onTouchEvent(event)

            // NestedScroll
            if (dispatchNestedScroll(0, mScrollOffset[1], 0, deltaY.toInt(), mScrollOffset)) {
                event.offsetLocation(0f, mScrollOffset[1].toFloat())
                mNestedOffsetY += mScrollOffset[1]
                mLastY -= mScrollOffset[1]
            }
        }
        ACTION_UP, ACTION_CANCEL -> {
            mNestedOffsetY = 0F
            returnValue = super.onTouchEvent(event)
            // end NestedScroll
            stopNestedScroll()
        }
    }
    return returnValue
}

// Nested Scroll implements
override fun setNestedScrollingEnabled(enabled: Boolean) {
    mChildHelper.isNestedScrollingEnabled = enabled
}

override fun stopNestedScroll() {
    mChildHelper.stopNestedScroll()
}

override fun isNestedScrollingEnabled() = mChildHelper.isNestedScrollingEnabled
override fun startNestedScroll(axes: Int) = mChildHelper.startNestedScroll(axes)
override fun hasNestedScrollingParent() = mChildHelper.hasNestedScrollingParent()
override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?) = mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow)
override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean) = mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed)
override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float) = mChildHelper.dispatchNestedPreFling(velocityX, velocityY)
override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int,
                                  offsetInWindow: IntArray?) = mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow)

}