Android Webview 函数调用并不总是有效

Android Webview function calls not always working

我希望能够通过 webview 缩放到给定的缩放系数,并滚动到特定的坐标。

由于我们的目标是 API 19,因此我们不能使用 zoomBy()(在 APi 21 中引入)并且必须尝试近似缩放。

这已经完成并正在运行。至少理论上是这样。

代码如下:

private void zoomWebview(int x, int y, int width, int height){
    int webviewWidth = mainWebview.getWidth();
    int webviewHeight = mainWebview.getHeight();

    float scaleX = (float)webviewWidth / width;
    float scaleY = (float)webviewHeight / height;

    final float scale;

    System.out.println("Scale X: "+scaleX);
    System.out.println("Scale Y: "+scaleY);

    if(scaleX < scaleY){
        scale = scaleX;
    }else{
        scale = scaleY;
    }

    System.out.println("Needed scale: "+scale);

    final int transX = x;
    final int transY = y;

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            float prevZoomFactor = mainWebview.getScale();

            if(mainWebview.getScale() > scale){
                do{
                    mainWebview.zoomOut();
                    System.out.println("Zoom out from "+prevZoomFactor+" to "+mainWebview.getScale());
                    if(prevZoomFactor == mainWebview.getScale()){
                        //In case zoomOut() wasn't able to actually zoom, break to prevent infinite loop
                        break;
                    }

                    prevZoomFactor = mainWebview.getScale();
                }while(mainWebview.getScale() > scale);
            }else{
                do{
                    mainWebview.zoomIn();
                    System.out.println("Zoom in from "+prevZoomFactor+" "+mainWebview.getScale());
                    if(prevZoomFactor == mainWebview.getScale()){
                        //In case zoomIn() wasn't able to actually zoom, break to prevent infinite loop
                        break;
                    }

                    prevZoomFactor = mainWebview.getScale();
                }while(mainWebview.getScale() < scale);

                //Make sure we do not cut off any content. Rather show a little border
                mainWebview.zoomOut();
            }
            System.out.println("Final zoom: "+mainWebview.getScale());

            mainWebview.scrollTo(Math.round(transX*mainWebview.getScale()), Math.round(transY*mainWebview.getScale()));
            System.out.println("Scroll to "+Math.round(transX*mainWebview.getScale())+"|"+Math.round(transY*mainWebview.getScale()));
        }
    });
}

最有趣的部分是应该在主线程上 运行 的部分。有时 webview 功能可用,有时不可用。

我可以通过单击按钮来调用此函数。我连续按了 4 次按钮。前3次没反应,第4次突然好了

而且这是可重现的,并非总是在一定数量的点击之后,但它肯定会在某个时候起作用。

控制台输出如下:

07-23 08:09:46.304: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:46.304: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:46.304: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:46.304: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:46.304: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:46.305: I/System.out(25659): Scroll to 49|12
07-23 08:09:47.117: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:47.117: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:47.117: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:47.120: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:47.121: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:47.121: I/System.out(25659): Scroll to 49|12
07-23 08:09:47.749: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:47.749: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:47.749: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:47.751: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:47.751: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:47.752: I/System.out(25659): Scroll to 49|12
07-23 08:09:48.298: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:48.298: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:48.298: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:48.314: I/System.out(25659): Zoom in from 1.6790987 2.0988734
07-23 08:09:48.314: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:48.314: I/System.out(25659): Scroll to 49|12

最后 6 个条目描述了它突然起作用的事件。请注意 webview 是如何突然从 1.67 缩放到 2.09 的。还有 scrollTo 函数,尽管使用相同的值调用。

如有任何帮助,我们将不胜感激。

问题是由 mainWebview.getScale() 的(已弃用)调用引起的。

解决方案是使用自定义 WebViewController,我在其中实现了 onScaleChanged-Listener 来获取我的网络视图的当前比例。

为了将我的 Zoom-Function 与我的监听器同步,我使用了 CountDownLatch