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

时间:2015-07-23 06:19:40

标签: android webview

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

由于我们的目标是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功能正在运行,有时则不然。

我可以通过buttonclick调用此函数。我连续按了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函数,虽然调用了相同的值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

为了将我的缩放功能与我的听众同步,我使用了CountDownLatch