Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- ListAdapter DiffUtil
- getChangePayload
- android ktor
- doc2vec
- kotlin collection
- 안드로이드
- ktor api call
- ExoPlayer
- android custom view
- ktor client
- 스피너
- AWS EC2
- DiffUtil.ItemCallback
- video caching
- list map
- ListAdapter
- FastAPI
- Python
- 시행착오
- build with ai
- 독서
- 카카오톡 웹뷰
- exoplayer cache
- ChatGPT
- android
- llm
- map
- kotlin list
- 유튜브
- android exoplayer
Archives
- Today
- Total
버튼 수집상
[안드로이드] ViewPager 내부 웹뷰 가로 스크롤 처리하기 본문
배경
ViewPager 안쪽 웹뷰에서 가로로 스크롤되는 UI가 있을 때 뷰페이저 페이지가 넘어가는 현상이 있었다.
예시 화면
포인터를 보면 웹뷰의 가로 스크롤 영역을 드래그했을 때 바깥쪽 뷰페이저가 넘어간다.
웹뷰의 가로 스크롤을 따로 읽는 함수는 없어서
onTouchEvent 안에서 터치 좌표로 처리했다.
CustomWebView.kt
class CustomWebView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : WebView(context, attrs, defStyle) {
private var oldY = 0f
private var oldX = 0f
init {
// 샘플 웹뷰 간단한 설정들
loadUrl("http://sample-domain.com/")
settings.apply {
javaScriptEnabled = true
}
webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
return false
}
}
}
// 뷰페이저 스와이핑 풀기
override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {
parent.requestDisallowInterceptTouchEvent(false)
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)
}
override fun onTouchEvent(ev: MotionEvent): Boolean {
if (ev.pointerCount > 1) {
return true
}
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
oldY = ev.y
oldX = ev.x
}
MotionEvent.ACTION_MOVE -> {
val diffY = abs(oldY - ev.y)
val diffX = abs(oldX - ev.x)
if (diffX > diffY) {
// 가로 스크롤일 때 뷰페이저 스와이핑 intercept
parent.requestDisallowInterceptTouchEvent(true)
// 세로 스크롤 고정
// ev.setLocation(ev.x, oldY)
} else {
parent.requestDisallowInterceptTouchEvent(false)
}
}
}
return super.onTouchEvent(ev)
}
}
웹뷰에 따라서는 가로 스크롤 할 때마다 세로 스크롤이 같이 움직이는 경우가 있었다.
주석처리된 세로 스크롤 고정 코드를 넣으면 어느정도 보정할 수 있다.
다만 가로 스크롤을 하는 도중에 손가락을 떼지 않고 위아래로 드래그했을 때 세로 스크롤이 드득거리는 현상이 있었다.
웹뷰에 위 코드를 추가하면 웹뷰의 가로 스크롤이 잘 되는 것을 확인할 수 있다.
추가
ViewPager 를 ViewPager2로,
FragmentStatePagerAdapter를 FragmentStateAdapter로 바꿔도 동일한 코드로 수정가능했다.
참고
https://akaisun.tistory.com/68
https://sysdocu.tistory.com/1284
728x90
'TIL - 안드로이드' 카테고리의 다른 글
[안드로이드] 시인성 향상 애니메이션 제거 여부 알기 (0) | 2023.07.03 |
---|---|
[안드로이드] RecyclerView에 radius 적용하기 (0) | 2023.07.03 |
[안드로이드] notify 호출 후 ViewPropertyAnimator 에서 알파값이 변하지 않는 이슈 (0) | 2023.06.15 |
[안드로이드] TabLayout.Tab 레이아웃에 커스텀뷰 세팅 + 뷰 추가하기 (0) | 2023.06.12 |
[안드로이드] 싱글액티비티 구조를 언제 쓰면 좋을까? (0) | 2023.05.23 |