如何在Java中缩放/缩放Android WebView

时间:2017-07-03 05:51:44

标签: java android android-webview

实际上我有两个网页浏览器,我想基于第一个webview缩放/平移其他webview。为此,应用程序已经使用以下代码,可以很好地工作到Android 3.0,但在以后的设备上,它不起作用。我检查并且异常被抛出i-e mZoomManager的Field Not Found异常。

我想知道缩放网页浏览的其他选择吗?无法使用webView.setInitialScale();

public void setScale(float scale_factor) throws IllegalArgumentException,
        IllegalAccessException, ClassNotFoundException {
    try {
        float temp_scale = scale_factor * 0.01f;
        Class<WebView> webViewClass = (Class<WebView>) this.getClass()
                .getSuperclass();
        Field mZoomManagerField = webViewClass
                .getDeclaredField("mZoomManager");
        mZoomManagerField.setAccessible(true);
        Object mZoomManagerInstance = mZoomManagerField.get(this);

        Class<?> zoomManagerClass;
        try {
            zoomManagerClass = Class.forName("android.webkit.ZoomManager");
            Field mInitialScale = zoomManagerClass
                    .getDeclaredField("mInitialScale");
            mInitialScale.setAccessible(true);
            mInitialScale.set(mZoomManagerInstance, temp_scale);

            Field mActualScale = zoomManagerClass
                    .getDeclaredField("mActualScale");
            mActualScale.setAccessible(true);
            if (temp_scale >=1) {
                mActualScale.set(mZoomManagerInstance, temp_scale);
            } else {
                Field mDefaultScale = zoomManagerClass
                        .getDeclaredField("mDefaultScale");
                mDefaultScale.setAccessible(true);
                Object obj=temp_scale;
                mDefaultScale.set(mZoomManagerInstance, obj);
                mActualScale.set(mZoomManagerInstance, temp_scale);
            }

            Field mInvActualScale = zoomManagerClass
                    .getDeclaredField("mInvActualScale");
            mInvActualScale.setAccessible(true);
            mInvActualScale.set(mZoomManagerInstance, 1 / temp_scale);
        } catch (Exception e) {
            e.printStackTrace();
        }

    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:0)

经过三天的研究,我无法找到任何解决方案,因为我必须从第8级到第23级给予支持。

所以我想出了

dependentWebView.setInitialScale(mainWebView.getScale()*100);

再次加载dependentWebView。

这种情况下的缩放并不完美。我尝试重写setInitialScale以给它一个浮点值以获得更高的准确性,但不能这样做,因为在不同的Android版本中缩放的处理方式不同。

发布此解决方案,以便其他人可以获得帮助。