私は、WebViewのoverScrollByイベントがトリガーされたときに、ViewPagerへのタッチイベントの伝播を禁止し、ページをスクロールすることによって解決策を開発しました。イベントのデルタXをチェックすることで、スクロールする方向を決定することができます。ここでkotlinソリューションです:
override fun overScrollBy(deltaX: Int, deltaY: Int, scrollX: Int, scrollY: Int, scrollRangeX: Int, scrollRangeY: Int, maxOverScrollX: Int, maxOverScrollY: Int, isTouchEvent: Boolean): Boolean {
if(parent.parent is WebViewPager) {
val viewPager: WebViewPager = (parent.parent as WebViewPager)
if(viewPager.scrollState == ViewPager.SCROLL_STATE_IDLE) {
if(deltaX > 0) {
if(checkAdapterLimits(1, viewPager.currentItem)) //right
(parent.parent as ViewPager).setCurrentItem(viewPager.currentItem + 1,true)
}
else {
if(checkAdapterLimits(-1, viewPager.currentItem)) //left
(parent.parent as ViewPager).setCurrentItem(viewPager.currentItem - 1,true)
}
}
}
return false
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
parent.requestDisallowInterceptTouchEvent(true)
return super.onInterceptTouchEvent(event)
}
private fun checkAdapterLimits(direction: Int, position: Int) : Boolean {
return if(direction < 0) //left
position >= 1
else //right
position < (parent.parent as ViewPager).adapter.count - 1
}
編集は、一度に一つだけのページにスクロールを停止するためには、あなたはそれがアイドルだことを確認するViewPagerのスクロール状態を確認する必要があります。
カスタムViewPagerにプロパティを追加し、使用しているViewPagerインスタンスのOnPageChangedListenerでそれを切り替える必要があります。
ViewPager:
class WebViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {
var scrollState: Int = SCROLL_STATE_IDLE
fun setDurationScroll(millis: Int) {
try {
val viewpager = ViewPager::class.java
val scroller = viewpager.getDeclaredField("mScroller")
scroller.isAccessible = true
scroller.set(this, OwnScroller(context, millis))
} catch (e: Exception) {
e.printStackTrace()
}
}
inner class OwnScroller(context: Context, durationScroll: Int) : Scroller(context, DecelerateInterpolator()) {
private var durationScrollMillis = 1
init {
this.durationScrollMillis = durationScroll
}
override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
super.startScroll(startX, startY, dx, dy, durationScrollMillis)
}
}
}
OnPageChangedListener:
viewPager!!.setDurationScroll(300)
viewPager!!.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
viewPager.scrollState = state
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
}
})
ここでは、便利なリンクです。 [Extended Webview](https://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager) –
ありがとうございますが、そのリンクは問題です。私のために働かなかった。答えは以下の通りでした。 – airowe
あなたは大歓迎です:) –