webview scroll detecting

2020. 12. 9. 16:26 안드로이드/개발 TIP

프로젝트를 진행하던 중 웹뷰의 스크롤에 따라 toolbar를 collapse, expand를 하는 기능을 만들게 되었다.

안드로이드에서는 web view의 스크롤을 감지하는 Listener를 제공하는데 다음과 같다.

webView.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> 
    // insert your code
}

하지만 문제가 있었는데 위의 기능은 API 23부터 제공하는 기능이었다.

그렇다면 23이전에서는 어떻게 스크롤을 탐지할 수 있을까? 

구글링의 결과 끝에 원하는 답을 찾을 수 있었다.

 

class CustomWebView : WebView {

    private var oldY: Float = 0.toFloat()
    private var webViewScrollListener: WebViewScrollListener? = null

    interface WebViewScrollListener {
        fun scrollDown()
        fun scrollUp()
    }

    fun setWebViewScrollListener(webViewScrollListener: WebViewScrollListener) {
        this.webViewScrollListener = webViewScrollListener
    }

    constructor(context: Context) : super(context) {
        // TODO Auto-generated constructor stub
    }

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
        context,
        attrs,
        defStyle
    ) {
        // TODO Auto-generated constructor stub
    }


    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        // TODO Auto-generated constructor stub
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                oldY = event.y
            }

            MotionEvent.ACTION_MOVE -> {
                if (event.y > oldY) {
                    webViewScrollListener?.scrollDown()
                }

                if (event.y < oldY) {
                    webViewScrollListener?.scrollUp()

                }
            }
            else -> {
            }
        }
        return super.onTouchEvent(event)
    }

}

다음과 같이 WebView를 상속 받은다음 OnTouchEvent에서 해당 모션과 해당 좌표를 받아 계산하면 된다.

 

custom class에 리스너를 넘겨주게되면 스크롤에 따라 해당 이벤트를 받아 처리할 수 있다.

private val webViewScrollListener = object : CustomWebView.WebViewScrollListener{

        override fun scrollDown() {
            Logger.e("scroll", "down")
        }

        override fun scrollUp() {
            Logger.e("scroll", "up")
        }
    }



출처: https://akaisun.tistory.com/68?category=622886 [아카이의 개발창고]