java - 如何从Android中的自定义位置编号加载webView
问题描述
在我的应用程序中,我想使用水平滑动 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
}
}
如何修复它并从自定义页码开始?
解决方案
我正在编写下面的伪代码,您可以通过它了解库代码的工作方式。
在您的创建方法HorizontalWebView.kt
如下
fun setPageNumber(number: Int) {
val displayMetrics = DisplayMetrics()
(context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)
currentX = (number * displayMetrics.widthPixels) + PADDING_OFFSET
scrollTo(currentX + PADDING_OFFSET, 0)
}
现在从您MainActivity.kt
调用上述方法。
val wv = findViewById<HorizontalWebView>(R.id.web_view)
wv.setPageNumber(3)// Page you want to load
wv.settings.javaScriptEnabled = true
wv.loadUrl("file:///android_asset/ch03.html")
注意:您可以在上述项目的 github 链接中提出问题。上面的代码只是快速的伪代码,需要更多的验证和改进。
请让我知道它是否适合您。