如何在 Java 中 Zoom/Scale Android WebView
How to Zoom/Scale an Android WebView in Java
实际上我有两个 webview,我想 zoom/pan 基于第一个 webview 的其他 webview。为此,应用程序已经使用了以下代码,在 android 3.0 之前可以正常工作,但在更高版本的设备上它不起作用。我检查并抛出异常,即 mZoomManager 的未找到字段异常。
我想知道缩放 webview 的任何替代方法吗?无法使用 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();
}
}
经过三天的研究,我无法找到任何解决方案,因为我不得不从 android 8 级到 23 级提供支持。
所以我想出了使用
dependentWebView.setInitialScale(mainWebView.getScale()*100);
并再次加载 dependentWebView。
这种情况下的缩放并不完美。我尝试重写 setInitialScale 以给它一个浮点值以获得更高的准确性,但无法做到这一点,因为在不同的 android 版本中缩放比例的处理方式不同。
发布此解决方案以便其他人获得帮助。
实际上我有两个 webview,我想 zoom/pan 基于第一个 webview 的其他 webview。为此,应用程序已经使用了以下代码,在 android 3.0 之前可以正常工作,但在更高版本的设备上它不起作用。我检查并抛出异常,即 mZoomManager 的未找到字段异常。
我想知道缩放 webview 的任何替代方法吗?无法使用 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();
}
}
经过三天的研究,我无法找到任何解决方案,因为我不得不从 android 8 级到 23 级提供支持。
所以我想出了使用
dependentWebView.setInitialScale(mainWebView.getScale()*100);
并再次加载 dependentWebView。
这种情况下的缩放并不完美。我尝试重写 setInitialScale 以给它一个浮点值以获得更高的准确性,但无法做到这一点,因为在不同的 android 版本中缩放比例的处理方式不同。
发布此解决方案以便其他人获得帮助。