首页 > 解决方案 > 如何从Android中的自定义位置编号加载webView

问题描述

在我的应用程序中,我想使用水平滑动 webview,为此,我在下面的库中找到。
https://github.com/GautamChibde/Android-Horizo​​ntal-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
    }
}

如何修复它并从自定义页码开始?

标签: javaandroidkotlinwebviewandroid-webview

解决方案


我正在编写下面的伪代码,您可以通过它了解库代码的工作方式。

在您的创建方法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 链接中提出问题。上面的代码只是快速的伪代码,需要更多的验证和改进。

请让我知道它是否适合您。


推荐阅读