Android中的WebView文本缩放问题

时间:2016-03-26 13:34:13

标签: javascript java android jquery webview

我在android中有一个文档阅读器项目。主要活动包括WebView。文本正在从html中读取。在“顶部选项”菜单中,包含一个用于动态增加文本大小的按钮(文本包装)。到目前为止很清楚,但按下按钮时,文本大小有所增加,但所有文本都在屏幕上向下移动,两次按下按钮,文本大小增加,所有文本再次向下移动一点。这种情况真的让读者感到沮丧。读者必须在按下按钮后返回停止的位置,以便读者不会丢失阅读位置。如何解决这个问题?

  

问题:

The Issue:

  

解决问题后:

When solved the issue:

  

我的WebView的Html内容:

<!DOCTYPE html>

    <head>
        <style type="text/css"> 
            p{} p.x1{} p.x2{} p.x3{} p.x4{} 
            h2.x1{} h2.x2{} h2.x3{} h2.x4{}
        </style>
    </head>

    <body>

        //paragraph-1
        <p class="x1">Title-1</p>
        <p class="x2">Title-2</p>
        <p class="x3">Title-3</p>
        <p class="x4">Title-4</p>
        <p>Text content.</p>


        //paragraph-2
        <h class="x1">Title-1</p>
        <h class="x2">Title-2</p>
        <p>Text content.</p>


        //paragraph-3
        <h class="x3">Title-1</p>
        <h class="x4">Title-2</p>
        <p class="x3">Title-3</p>
        <p>Text content.</p>


        //paragraph-4
        <h class="x2">Title-1</p>
        <p class="x3">Title-2</p>
        <p>Text content.</p>


        //...

    </body>

</html>

4 个答案:

答案 0 :(得分:2)

您应该在ListView中使用TextViews,并在缩放之前和缩放滚动到存储的列表项之后存储顶级列表项的ID。为了获得良好的滚动效果,您应该隐藏具有基本图像缩放效果的滚动效果。

答案 1 :(得分:1)

我在屏幕上保留文字的想法是存储对任何&#34;元素的引用&#34; (p,div,img等)在屏幕上某个x,y点,更改字体大小,然后滚动该元素返回到屏幕上。

我创建了一个适用于Android Webview的工作代码示例:

//Route your onclick handler to our new function
function fontBtnClk() {

  //Store whatever paragraph container is in the middle of the screen
  var currentParagraph = document.elementFromPoint(window.innerWidth/3, window.innerHeight/3);

  //If the above "paragraph selector" selected the whitespace in-between two paragraphs, and stored the parent element instead:
  if(currentParagraph.tagName.toLowerCase()=="body") {

    //Divide by a different number to select the winning paragraph
    currentParagraph = document.elementFromPoint(window.innerWidth/3, window.innerHeight/2);
  }

  //Call your existing font size handler
  increaseFontSize();

  //Move the previous paragraph back onto the screen:
  currentParagraph.scrollIntoView();
}

希望这可以解决您的问题!

答案 2 :(得分:1)

我建议在字体大小增加之前和之后使用 relative 滚动来计算用户应该在哪里。这可以通过几个步骤完成:

  1. 在更改字体大小之前,请存储文本视图的滚动高度和滚动位置。确定滚动高度和滚动位置之间的比率(介于0和1之间)
  2. 更改字体大小
  3. 渲染后,测量新的滚动高度
  4. 将新滚动位置设置为新滚动高度乘以旧比率。
  5. 相关摘录:

    function setSize() {
      var heightBefore = textContainer.scrollHeight;
      var scrollBefore = textContainer.scrollTop;
      var percBefore = scrollBefore / heightBefore;
    
      textContainer.style.fontSize = fontSize + "px";
    
      var heightAfter = textContainer.scrollHeight;
      var scrollAfter = textContainer.scrollTop;
    
      var correctedScrollAfter = Math.floor(heightAfter * percBefore);
      textContainer.scrollTop = correctedScrollAfter;
    }
    

    您可以在此处查看示例:https://jsfiddle.net/Ln43xxv5/

    我必须承认我现在无法在Android中测试,但我相信总体方向应该有效。

答案 3 :(得分:-1)

试试这个:

String uri="But your http URL";
URL url = new URL(uri);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
            con.setDoOutput(true);
            OutputStreamWriter writer=new     OutputStreamWriter(con.getOutputStream());
StringBuilder sb=new StringBuilder();
sb.append("username="+"Naham");
sb.append("password="+"passNaham");
            writer.write(sb.toString());
            writer.flush();