【发布时间】:2020-01-02 13:10:43
【问题描述】:
在我的应用程序中,我想使用 horizontal swipe webview,为此,我找到了下面的库。
https://github.com/GautamChibde/Android-Horizontal-Swipe-WebView
但我希望起始页是我的自定义页码,但它总是从第一页开始。
例如,我想从第 3 页开始。
此自定义 webView 代码:
class HorizontalWebView2(context: Context,
attrs: AttributeSet) : WebView(context, attrs) {
private var x1 = -1f
private var pageCount = 0
private var currentPage = 0
private var currentX = 0
private var delta: Int = 30
private var pageNumber: Int = 1
private val prevPagePosition: Int
get() = ceil((--currentPage * this.measuredWidth).toDouble()).toInt()
private val nextPagePosition: Int
get() = ceil((++currentPage * this.measuredWidth).toDouble()).toInt()
init {
setDelta()
this.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
injectJavascript()
}
}
this.webChromeClient = object : WebChromeClient() {
override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
val pageCount = Integer.parseInt(message)
this@HorizontalWebView2.setPageCount(pageCount)
injectCSS()
result.confirm()
return true
}
}
}
private fun setDelta() {
val displayMetrics = DisplayMetrics()
(context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)
delta = (displayMetrics.widthPixels * 0.04).toInt()
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_MOVE -> super.onTouchEvent(event)
MotionEvent.ACTION_DOWN -> {
x1 = event.x
return super.onTouchEvent(event)
}
MotionEvent.ACTION_UP -> {
val x2 = event.x
val deltaX = x2 - x1
if (abs(deltaX) > delta) {
// Left to Right swipe action
return if (x2 > x1) {
turnPageLeft(deltaX)
true
} else {
turnPageRight(deltaX)
true
}// Right to left swipe action
}
}
else -> super.onTouchEvent(event)
}
return super.onTouchEvent(event)
}
private fun turnPageLeft(deltaX: Float) {
if (currentPage > 0) {
val scrollX = prevPagePosition
loadAnimation(scrollX, deltaX)
currentX = scrollX
scrollTo(scrollX, 0)
pageNumber--
EventBus.getDefault().post(EventPageNumber(pageNumber))
}
}
private fun turnPageRight(deltaX: Float) {
if (currentPage < pageCount - 1) {
val scrollX = nextPagePosition
loadAnimation(scrollX + PADDING_OFFSET, deltaX)
currentX = scrollX + PADDING_OFFSET
scrollTo(scrollX + PADDING_OFFSET, 0)
pageNumber++
EventBus.getDefault().post(EventPageNumber(pageNumber))
}
}
private fun loadAnimation(scrollX: Int, deltaX: Float) {
val anim = ObjectAnimator.ofInt(this, "scrollX",
currentX - deltaX.toInt(), scrollX)
anim.duration = SCROLL_DURATION
anim.interpolator = LinearInterpolator()
anim.start()
}
private fun injectJavascript() {
val js = "function initialize(){\n" +
" var d = document.getElementsByTagName('body')[0];\n" +
" var ourH = window.innerHeight - 40;\n" +
" var ourW = window.innerWidth - (2*20);\n" +
" var fullH = d.offsetHeight;\n" +
" var pageCount = Math.floor(fullH/ourH)+1;\n" +
" var currentPage = 0;\n" +
" var newW = pageCount*window.innerWidth - (2*20);\n" +
" d.style.height = ourH+'px';\n" +
" d.style.width = newW+'px';\n" +
" d.style.margin = 0;\n" +
" d.style.webkitColumnGap = '40px';\n" +
" d.style.webkitColumnCount = pageCount;\n" +
" document.head.innerHTML = document.head.innerHTML + '<meta name=\"viewport\" content=\"height=device-height, user-scalable=no\" />';" +
" return pageCount;\n" +
"}"
this.loadUrl("javascript:$js")
this.loadUrl("javascript:alert(initialize())")
}
private fun injectCSS() {
this.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var style = document.createElement('style');" +
"style.type = 'text/css';" +
"style.innerHTML = 'body { padding: 20px 20px !important; }';" +
"parent.appendChild(style)" +
"})()")
}
fun setPageCount(pageCount: Int) {
this.pageCount = pageCount
}
fun getPageCount(): Int {
return pageCount
}
companion object {
const val SCROLL_DURATION: Long = 400
const val PADDING_OFFSET = 10
}
}
如何修复它并从自定义页码开始?
【问题讨论】:
-
设置 currentPage = 3 然后试试看。并更改 turnPageLeft 方法的条件。
-
@ViralPatel 那将是静态选项。而是创建一个构造函数并在其中设置当前位置,这样您就可以传递您想要的任何位置。
-
@ViralPatel,我更改了 currentPage 但没有更改任何页面!但我怎样才能改变 turnLeft 方法?你能把代码发给我吗?请
-
@VirRajpurohit,谢谢我的朋友。你能把代码发给我吗?请。我真的需要你的帮助
标签: java android kotlin webview android-webview