【问题标题】:Zooming in/out on Android Webview without a set limit在没有设置限制的情况下放大/缩小 Android Webview
【发布时间】:2012-05-11 18:16:21
【问题描述】:

在我当前的项目中,我需要我的用户能够滚动并放大大型 SVG 图片。我遇到的一个主要问题是 android WebView 类对放大和缩小的限制。有什么办法可以根据自己的喜好删除或更改这些限制? 标准缩放控件似乎不支持释放这些边界。

如果我的问题不清楚,或者如果我需要详细说明我的问题,请随时提问。

您好, 沃塔

【问题讨论】:

  • 您需要它来通用还是在特定的 Android 风格上工作?我之所以问,是因为 WebView 的缩放实现在不同版本中发生了相当大的变化。您应该能够使用反射来绕过这个“限制”,但如果您想让它在一系列设备/操作系统版本上工作,最好为一大堆不同的情况做好准备。
  • 我需要它在 ICS(4.0.3) 上工作。最好在平板电脑和智能手机上。我目前正在华硕 EEE 变压器 Prime 平板电脑上测试我的应用程序。但我希望我的应用程序也能在三星 Galaxy SII 等设备上运行。没有适用于所有安卓设备的单一解决方案吗?

标签: android webview svg android-webview zooming


【解决方案1】:

由于似乎没有人提出与使用反射不同的解决方案 - 我目前不知道有任何替代方案 - 我编写了一个快速代码 sn-p 来说明如何绕过放大动作。

请注意,下面的代码仅适用于 ICS,可能还适用于 Honeycomb,但我目前没有平板电脑来检查内部工作是否依赖于相同的 ZoomManager 类。 Gingerbread、Froyo 和 Eclair 似乎都或多或少地直接在 WebView 类中实现了缩放功能。通过下面的示例,添加一些代码以将这些操作系统也考虑在内应该相当容易。

// just set an Activity's content view to a single WebView for this test
WebView mWebview = new WebView(this);
setContentView(mWebview);

// retrieve the ZoomManager from the WebView
Class<?> webViewClass = mWebview.getClass();
Field mZoomManagerField = webViewClass.getDeclaredField("mZoomManager");
mZoomManagerField.setAccessible(true);
Object mZoomManagerInstance = mZoomManagerField.get(mWebview);

// modify the "default max zoom scale" value, which controls the upper limit
// and set it to something very large; e.g. Float.MAX_VALUE
Class<?> zoomManagerClass = Class.forName("android.webkit.ZoomManager");
Field mDefaultMaxZoomScaleField = zoomManagerClass.getDeclaredField("mDefaultMaxZoomScale");
mDefaultMaxZoomScaleField.setAccessible(true);
mDefaultMaxZoomScaleField.set(mZoomManagerInstance, Float.MAX_VALUE);

【讨论】:

  • 这正是我所需要的!谢谢!!您刚刚解决了我实习项目的主要问题之一^^。我不需要我的应用程序在低于 ICS 的版本上工作,因为我的应用程序的一些关键功能仅在 4.0 上实现。我在这个问题上思考了很久。请问您是如何获得像这样编辑 webview 类所需的信息的? (这是我的第一个 android 项目,我真的很投入)
  • 发给我一份你的最终报告,我们会称它为偶数。 ;) 就我在哪里/如何找到这种方法的信息而言:我强烈推荐grepcode 当涉及到 Android 资源时。我刚刚浏览了WebView 的内部工作原理,然后将我带到了ZoomManager。最后一个关键因素是具有描述性的变量名称,幸运的是,Android 往往具有。有了这些细节后,实现实际反射就相对简单了,如上所示。
  • 我明白了,这有助于将所有内容置于上下文中。就报告而言:它将是荷兰语,所以我会看看我能做些什么xD。
  • @Wottah:称其为巧合,但这实际上根本不是问题,因为我自己是荷兰人。 :)
  • @PointerNull:Android KitKat 及以上(19 岁以上)不再使用 webkit(而是基于 Chromium 的 WebView 实现),因此可以预期提议的 hack 不再有效。您必须深入研究更新的源代码以查看是否存在替代方法。请注意,原始代码仅用于研究目的 - 您应该在生产代码中依赖它,永远
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2021-10-31
  • 2013-03-14
相关资源
最近更新 更多