我对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的设备兼容。
答案 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()
重要说明:您需要记住两个细节,否则它将无效。
您需要使用方法@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(...)
属性就无法指向您的图片文件。
您的HTML代码中需要标记src
,并且必须在<meta name="viewport" content="...">
属性中包含target-densitydpi=device-dpi
。否则,图像的大小可能仍与您的视口不匹配。
注意:您还可以在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);