2

我想用来显示图像并使其可缩放的 WebView 有一个奇怪的问题。我的活动中有以下方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_manual);

    WebView webView = (WebView)findViewById(R.id.webView);      
    webView.loadUrl("file:///android_res/drawable/some_image.jpg");
    webView.setInitialScale(getScale());
    webView.getSettings().setBuiltInZoomControls(true);
}

getScale()方法计算了一个比例,我可以使用它webView.setInitialScale()来将我的图像精确地缩放到全屏宽度,并且它可以工作。内置缩放控件在某种程度上也可以工作,但是:

放大图像后,我无法缩小回初始比例,我假设是因为最小比例大于我的初始比例。

使用 WebSettings 设置缩放密度没有帮助,我认为即使它在我的手机上也不会在另一个手机上。

我还尝试过:我制作了一个 HTML 页面,其中包含图像作为 body 元素的唯一子元素。我将它的宽度设置为 100%,并以这种方式正确缩放。但是,如果我再次放大,图像会立即调整大小以再次适合屏幕宽度。

我找到了一些答案,但没有一个真正有帮助:

    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setDefaultZoom(ZoomDensity.FAR);
    webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

一种解决方案提到使用反射来更改 WebView 类以忽略限制,但我担心这可能会在某些旧版本的 Android 上破坏我的应用程序。我必须兼容低至 API 级别 9 的设备。

4

2 回答 2

3

我想我找到了适合大多数情况的解决方案,只要我们只想加载单个图像。这是一种解决方法,在调整图像大小时会丢失一些图像细节。尽管如此,它应该可以在大多数设备上运行,如果不是所有设备的话。

我按照将图像嵌入到基本 HTML 页面中的方法,并<img>用屏幕宽度(以像素为单位)填充标签。为简单起见,我跳过了从文件中加载 HTML,而是在我的 Java 代码中生成了它:

private String generatePage() {
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int displayWidth = display.getWidth();

    String result =
            "<html>"
            + "<meta name=\"viewport\" content=\"target-densitydpi=device-dpi,width=device-width\">"
            + "<head>"
            + " <title>Title</title>"
            + "</head>"
            + "<body>"
            + "<image id=\"myImage\" src=\"drawable/image.jpg\" width=\"" + displayWidth + "px\" />"
            + "</body>"
            + "</html>";
    return result;
}

我将此方法添加到我的 Activity 中,并使用它来生成与它运行的设备匹配的代码。该onCreate()方法现在可以非常简单:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_manual);

    WebView webView = (WebView)findViewById(R.id.webView);

    webView.loadDataWithBaseURL("file:///android_res/", generatePage(), "text/html", "utf-8", null);
    webView.getSettings().setBuiltInZoomControls(true);
}

重要提示:您需要牢记两个细节,否则将不起作用。

  1. 您需要使用方法webView.loadDataWithBaseURL(...),否则您无法访问HTML中的本地android资源。这样该src属性就无法指向您的图像文件。

  2. 您需要<meta name="viewport" content="...">HTML 代码中的标签,并且它必须包含target-densitydpi=device-dpi在其content属性中。否则图像的大小可能仍然与您的视口不匹配。

注意:您也可以minimal-scaleviewport标签内指定 a,这确实影响了我的 webview。坏事:至少在我的 Galaxy S3 mini 上运行 Jelly Bean 4.1.2 aminimal-scale小于 1.0 没有效果。

于 2013-10-27T12:43:52.187 回答
-2

可能这就是您正在搜索的内容

settings.setBuiltInZoomControls(true);
settings.setSupportZoom(true);
settings.setUseWideViewPort(true);
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
于 2014-09-30T07:57:34.977 回答