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




    









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("
" + "
"); 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中设置的属性

android:hardwareAccelerated="false"

这样也可以直接加载大图

你可能感兴趣的:(Android 使用WebView加载大图片)