Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android上的WebView中设置RTL水平滚动_Android_Kotlin_Webview - Fatal编程技术网

如何在Android上的WebView中设置RTL水平滚动

如何在Android上的WebView中设置RTL水平滚动,android,kotlin,webview,Android,Kotlin,Webview,在我的应用程序中,我想显示HTML内容,我应该水平滚动WebView(逐页),而不垂直滚动 我找到了此解决方案的以下代码,但此库从左向右滚动(LTR)。 我想要滑动滚动RTL 库链接: 自定义网络视图代码: class HorizontalWebView(context: Context, attrs: AttributeSet) : WebView(context, attrs) { private var x1 = -1f pr

在我的应用程序中,我想显示HTML内容,我应该水平滚动
WebView
逐页),而不垂直滚动
我找到了此解决方案的以下代码,但此库从左向右滚动(LTR)。
我想要滑动滚动RTL
库链接:

自定义网络视图代码:

class HorizontalWebView(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() = Math.ceil((--currentPage * this.measuredWidth).toDouble()).toInt()

    private val nextPagePosition: Int
        get() = Math.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@HorizontalWebView.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 (Math.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--
        }
    }

    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++
        }
    }

    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 getPageNumber(): Int {
        return pageNumber
    }

    companion object {
        const val SCROLL_DURATION: Long = 400
        const val PADDING_OFFSET = 10
    }
}
class HorizontalWebView(上下文:上下文,
属性集):网络视图(上下文,属性集){
私有变量x1=-1f
私有变量pageCount=0
私有变量currentPage=0
专用变量currentX=0
私有变量增量:Int=30
专用变量页码:Int=1
私人val prevPagePosition:Int
get()=Math.ceil((-currentPage*this.measuredWidth).toDouble()).toInt()
私人val nextPagePosition:Int
get()=Math.ceil((++currentPage*this.measuredWidth).toDouble()).toInt()
初始化{
setDelta()
this.webViewClient=对象:webViewClient(){
覆盖乐趣onPageFinished(视图:WebView,url:String){
注入JavaScript()
}
}
this.webChromeClient=对象:webChromeClient(){
重写有趣的onJsAlert(视图:WebView,url:String,消息:String,结果:JsResult):布尔值{
val pageCount=Integer.parseInt(消息)
this@HorizontalWebView.setPageCount(页数)
注入CSS()
结果.确认()
返回真值
}
}
}
私人娱乐{
val displayMetrics=displayMetrics()
(作为活动的上下文)。windowManager.defaultDisplay.getMetrics(displayMetrics)
delta=(displayMetrics.widthPixels*0.04).toInt()
}
@SuppressLint(“ClickableViewAccessibility”)
重写事件(事件:MotionEvent):布尔值{
何时(事件、动作){
MotionEvent.ACTION\u MOVE->super.onTouchEvent(事件)
MotionEvent.ACTION\u向下->{
x1=事件.x
返回super.onTouchEvent(事件)
}
MotionEvent.ACTION\u UP->{
val x2=事件.x
val deltaX=x2-x1
如果(数学绝对值(增量税)>增量){
//从左向右滑动动作
如果(x2>x1)返回{
左转(deltaX)
真的
}否则{
turnPageRight(deltaX)
真的
}//从右向左滑动动作
}
}
else->super.onTouchEvent(事件)
}
返回super.onTouchEvent(事件)
}
私人娱乐左转(deltaX:浮动){
如果(当前页面>0){
val scrollX=页面位置
加载动画(scrollX、deltaX)
currentX=scrollX
scrollTo(scrollX,0)
页码--
}
}
私人娱乐turnPageRight(deltaX:Float){
如果(当前页面<页面计数-1){
val scrollX=nextPagePosition
加载动画(scrollX+PADDING_OFFSET,deltaX)
currentX=滚动X+填充偏移量
scrollTo(scrollX+PADDING\u偏移量,0)
页码++
}
}
私人娱乐加载动画(scrollX:Int,deltaX:Float){
val anim=ObjectAnimator.ofInt(这是“scrollX”,
currentX-deltaX.toInt(),scrollX)
anim.duration=滚动\持续时间
anim.interpolator=LinearInterpolator()
动画开始()
}
private-fun-javascript(){
val js=“函数初始化(){\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+”+
“返回页面计数;\n”+
"}"
this.loadUrl(“javascript:$js”)
this.loadUrl(“javascript:alert(initialize())”)
}
私人娱乐中心{
this.loadUrl(“javascript:(函数(){”+
“var parent=document.getElementsByTagName('head')。项(0);”+
“var style=document.createElement('style')+
“style.type='text/css';”+
“style.innerHTML='body{padding:20px 20px!important;}'”+
“父项。子项(样式)”+
"})()")
}
乐趣设置页面计数(页面计数:Int){
this.pageCount=pageCount
}
fun getPageNumber():Int{
返回页码
}
伴星{
持续时间:长=400
常数val PADDING_OFFSET=10
}
}

如何启用RTL滚动?

@KanzariyaHitesh,你能用我上面的代码给我发送代码吗?求你了,我的friend@KanzariyaHitesh,你们在这里帮助我吗?若用户想回到上一个屏幕怎么办?你能详细说明一下你到底想要什么吗?是的,我很努力,但没有工作。对不起,伙计。@KanzariyaHitesh,我用你的话改变代码,设置RTL滚动,但从左边开始第一页,我想要从右边开始第一页