(Android/안드로이드) WebView 스크롤 감지하기 (Scroll up & Scroll down)

✨ 개요

WebView 내부 스크롤 이벤트를 활용해 하단 탭 숨기기 / 노출, 상단 툴바 애니메이션 처리 등을 구현하려면 스크롤 방향(Up or Down)을 정확하게 감지해야 한다.

이 글에서는 WebView의 Up/Down 스크롤 방향 감지 방법을 코드 중심으로 정리한다.


1. Scroll up/down 코드 & 중복호출 막기

1-1 스크롤 코드

webView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
val dy = scrollY - oldScrollY

    if (dy > 0) {
        // 내려가는 중 → 숨김
        requestBottomVisibility(false)
    } else if (dy < 0) {
        // 올라가는 중 → 보임
        // 단, 아래 끝에서 튕긴 경우는 무시
        if (webView.canScrollVertically(1)) {
            requestBottomVisibility(true)
        }
    }
}

1-2 중복호출 Runnable 구현

private val handler = Handler(Looper.getMainLooper())
private var pendingRunnable: Runnable? = null

private fun requestBottomVisibility(visible: Boolean) {
    // 이미 목표 상태가 같으면 할 필요 없음
    if (desiredVisible == visible) return
    desiredVisible = visible

    // 기존 예약된 애니메이션 제거 → 중복 호출 방지
    pendingRunnable?.let { handler.removeCallbacks(it) }

    // 새로 예약
    pendingRunnable = Runnable {
        if (isVisible == desiredVisible) return@Runnable  // 애니메이션 중복 방지

        if (desiredVisible) {
            bottomTab.animate()
                .translationY(0f)
                .setDuration(200)
                .start()
        } else {
            bottomTab.animate()
                .translationY(bottomTab.height.toFloat())
                .setDuration(200)
                .start()
        }

        isVisible = desiredVisible
    }

    // 바로 실행해도 되고, 0~20ms 정도 딜레이를 줘도 안정적
    handler.post(pendingRunnable!!)
}

2. 정리

✔ show/hide 중복 호출 없음

✔ 부드러운 UI

✔ 바닥에서 튕김에 의한 show 방지

✔ 현재 상태(isVisible)와 목표(desiredVisible)를 분리



Related Posts