webview scroll detecting
프로젝트를 진행하던 중 웹뷰의 스크롤에 따라 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 [아카이의 개발창고]
'안드로이드 > 개발 TIP' 카테고리의 다른 글
okhttp3를 이용하여 재인증하기(refresh token) (0) | 2021.03.18 |
---|---|
retrofit2를 사용하여 Authorization 인증하기 (0) | 2020.12.09 |
progress wrapper (0) | 2020.12.09 |
바코드, QR CODE 생성 및 스캐너 (0) | 2020.12.09 |
Room에서 LiveData사용과 paging처리 (0) | 2020.12.09 |
SharedPreferences 똑똑하게 사용하기. (0) | 2020.12.09 |
x86 emulation currently requires hardware acceleration (0) | 2020.12.09 |
library version check (0) | 2020.12.09 |