Android 使用WebView加载大图片

Android 中ImageView加载超长图片会报一个警告,并且无法在ImageView上渲染图片。

OpenGLRenderer: Bitmap too large to be uploaded into a texture (440x13323, max=4096x4096)

据查,开启了硬件加速后,OpenGLRenderer能够加载Bitmap的具有限制最大值。
eg:当前的最大限制是 4096x4096
这个限制的最大值可以根据方法获得:

canvas.getMaximumBitmapHeight()和canvas.getMaximumBitmapWidth()

当ImageView无法渲染这些图片的时候,我们可以使用WebView来显示这张图片

我们需要借助一个库 jsoup,一个Java 的HTML解析器
下面来说具体的实现。

1、在assets下新建一个html文件,名为largeimg.xml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="application/vnd.wap.xhtml+xml;charset=utf-8"/>

</head>
<body>


</body>

</html>

2、利用jsoup中的Document类,进行html的解析,获取到html的字符串。

  BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(getAssets().open(
                    "largeimg.html"), "UTF-8"));
            String mLine = reader.readLine();
            while (mLine != null) {
                mHtml += mLine;
                mLine = reader.readLine();
            }
            Log.e("TAG", "mHtml >> " + mHtml);
            doc = Jsoup.parse(mHtml);
        } catch (IOException e) {
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    // log the exception
                }
            }
        }

3、设置webview,构建html代码

        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(true);
        settings.setBuiltInZoomControls(false);
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        readNativeTemplateFile();//第二步骤中的代码
        Elements body = doc.select("body");
        webView.addJavascriptInterface(new JsObject(), "injectObject");//第4步骤
        body.html("<div><img width=\"100%\" height=\"auto\" src=\"" + imgUrl + "\" onclick='javascript:injectObject.close();' />"
                + "</div>");
        webView.loadDataWithBaseURL(
                "file:///android_asset/", doc.html(),
                "text/html", "UTF-8", "");

4、addJavascriptInterface

  class JsObject {
        JsObject() {
        }

        public String toString() {
            return "injectedObject";
        }

        @JavascriptInterface
        public void close() {
            finish();//finish掉当前的activity
        }
    }

至此,webview就可以显示一张图片了。

附:jsoup下载地址 https://jsoup.org/download

PS:可以通过关闭硬件加速的方法直接加载大图片
在AndroidManifest.xml中设置<application>的属性

android:hardwareAccelerated="false"

这样也可以直接加载大图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,100评论 25 708
  • 花开花落又一春, 匆匆忙忙过路人。 哪里觅得时光影, 几缕白发几道纹。
    孙卫卫阅读 211评论 0 1
  • 放下手机 包治百病
    晴窗细分茶阅读 170评论 0 0
  • 一辈子不长,每晚睡觉前原谅所有的人或事
    吾本良人阅读 171评论 0 0
  • 1.对考研没有信心,犹豫不决 扎实基础,一步步学习自然有信心。 2.不确定所选专业是否是自己喜欢的 不断去尝试,去...
    小白菜炒肉阅读 323评论 0 0