如何在Android上的WebView中设置RTL水平滚动
在我的应用程序中,我想显示HTML内容,我应该水平滚动如何在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
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滚动,但从左边开始第一页,我想要从右边开始第一页