프로젝트를 진행하던 중 웹뷰의 스크롤에 따라 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")
}
}
'안드로이드' 카테고리의 다른 글
progress wrapper (2) | 2019.09.23 |
---|---|
바코드, QR CODE 생성 및 스캐너 (519) | 2019.09.12 |
Room에서 LiveData사용과 paging처리 (2) | 2019.09.05 |
SharedPreferences 똑똑하게 사용하기. (2) | 2019.08.29 |
x86 emulation currently requires hardware acceleration (2) | 2019.02.22 |
댓글