设置webview的最小缩放级别(Android)

时间:2013-10-25 15:26:41

标签: android webview zoom minimum

我对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的设备兼容。

2 个答案:

答案 0 :(得分:3)

我认为只要我们只想加载单个图像,我就会在大多数情况下找到解决方案。这是一种解决方法,并在调整图像大小时丢失一些图像细节。然而,它应该适用于大多数(如果不是全部)设备。

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

<img>

我将此方法添加到我的Activity中,并使用它来生成与其运行的设备匹配的代码。 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; } 方法现在非常简单:

onCreate()

重要说明:您需要记住两个细节,否则它将无效。

  1. 您需要使用方法@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); } ,否则您无法访问HTML中的本地android资源。这样webView.loadDataWithBaseURL(...)属性就无法指向您的图片文件。

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

  3. 注意:您还可以在content标记内指定minimal-scale,这确实会影响我的网页浏览量。坏事:至少在运行Jelly Bean 4.1.2的Galaxy S3 mini上,viewport小于1.0没有效果。

答案 1 :(得分:-2)

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

settings.setBuiltInZoomControls(true);
settings.setSupportZoom(true);
settings.setUseWideViewPort(true);
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);