상황
ViewPager2 내에 WebView를 넣었을 때, WebView 안에 배너와 같은 horizonScroll이 가능한 View가 있으면 충돌이 일어난다.
처리 방법
- WebView의 Down 터치 이벤트 감지 시 ViewPager의 Swipe 기능 Off
- WebView의 Up 터치 이벤트 감지 시 ViewPager의 Swipe 기능 On
- WebView 내에서 OverScroll 감지 시 ViewPager Swipe 기능 On
→ WebView에서 Down 터치 이벤트가 감지되는 순간 ViewPager에 사용자 액션을 차단하여 터치 이벤트를 WebView 내의 배너(기타 스크롤이 가능한 뷰들)가 가져가도록 하는 것
코드
CustomWebView.kt
class CustomWebView : WebView {
constructor(context: Context): super(context)
constructor(context: Context, attrs:AttributeSet): super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int): super(context, attrs, defStyleAttr)
private var viewPagerController: ViewPagerController? = null
fun setViewPagerController(controller: ViewPagerController?){
viewPagerController = controller
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when(event.action){
MotionEvent.ACTION_DOWN -> {
startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL)
viewPagerController?.setPagingEnabled(false)
}
MotionEvent.ACTION_CANCEL,
MotionEvent.ACTION_UP -> {
viewPagerController?.setPagingEnabled(true)
}
}
return super.onTouchEvent(event)
}
/**
* clampedX 화면이 양 옆의 끝에 도달했을 때
* clampedY 화면이 최상단/최하단에 도달 했을 때
*/
override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {
if(clampedX) { // 좌우로 오버스크롤이 발생한 경우에만 페이지 전환
viewPagerController?.setPagingEnabled(true)
}
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)
}
/**
* WebView를 위아래로 스크롤 중인 경우에는
* WebView가 터치 이벤트를 독점하도록 함 (ViewPager가 전환되지 않음)
*/
override fun onScrollChanged(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
requestDisallowInterceptTouchEvent(scrollY != oldScrollY)
return super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY)
}
}
ViewPagerController.kt
interface ViewPagerController {
fun setPagingEnabled(isEnabled:Boolean)
}
class MainActivity : AppCompatActivity(), ViewPagerController {
private val vpViewPager:ViewPager2 by lazy {
findViewById(R.id.vpViewPager)
}
/.../
override fun setPagingEnabled(isEnabled: Boolean) {
vpViewPager.isUserInputEnabled = isEnabled
}
}
'안드로이드 > 이론' 카테고리의 다른 글
[ 안드로이드 ] RecyclerView - StaggeredLayoutManager 아이템 위치에 따라 여백 설정하기 (0) | 2023.08.22 |
---|---|
[ 안드로이드 ] WebView 동영상 전체화면 처리 ( + 상단바 숨기기) (0) | 2023.07.12 |
[ 안드로이드 ] WebView 페이지 탐색 처리 (0) | 2023.07.06 |
[ 안드로이드 ] WebView 기본 사용법 (0) | 2023.07.06 |
[ 안드로이드 ] 클릭 가능한 모든 뷰에 반투명 효과 넣기 (0) | 2023.05.20 |