gpt4 book ai didi

android - 在 ViewPager 中水平滚动 WebView

转载 作者:可可西里 更新时间:2023-11-01 19:07:11 26 4
gpt4 key购买 nike

有一个few questions asked在这个问题上,但没有人给出对我们有用的真正解决方案。我们有一个包含动态数量的 web View (内部 fragment )的 ViewPager,有时需要水平滚动。

我们看到的问题是,当水平滚动时,那些滚动事件(或拖动或滑动)被 ViewPager 拦截,然后提示在操作方向上进行页面切换。

WebView 要么没有向其父级报告其内容的宽度,要么 ViewPager 不加区别地捕获了它应该捕获的操作。

我尝试使用 computeHorizo​​ntalScroll() 解决方案,这看起来很有希望,但该方法总是返回 0,对我没有好处。

  1. 为什么没有像 getContentHeight() 那样获取 WebView 的 HTML 内容的实际内容宽度的方法? ?这将为我们提供所需的东西,但不幸的是,API 中没有提供它。
  2. 有没有人看到这个问题的解决方法确实有效?

最佳答案

因此,我最终开发了一个解决方案,禁止在触发 WebView 的 overScrollBy 事件时将触摸事件传播到 ViewPager 和滚动页面。您可以通过检查事件的 deltaX 来确定要滚动的方向。这是一个 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) {

}

})

关于android - 在 ViewPager 中水平滚动 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com