Android WebView截取长图

前言

再一次完善App功能时,由于使用了富文本来完成安卓APP的markdown语法支持,故用来常用的开源库,但是后面就遇到了第一个坑,首先绝大部分都是采用HTML来解析和显示预览,与PC端的解析流程相似,所以后续为了让页面可以分享出去,类似笔记软件的分析图片功能,起初想的是直接讲webView直接截图,保存为图片分享,在最开始的实验中,表现非常良好,但是遗漏了很重要的地方,就是整个页面很长的情况,直接GG,只有在屏幕显示的区域是有图片,在屏幕未显示区域为白色,瞬间傻眼,连忙查阅资料,搜寻,功夫不负有心人,不是我一个人出状况,查阅到一篇类似的文章,连忙测试,下面附上解决方案。

在android5.0及以上版本使用webView进行截长图时,默认是截取可是区域内的内容.因此需要在支撑窗体内容之前加上如下方法.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   WebView.enableSlowWholeDocumentDraw();
}
//在设置布局xml文件之前
setContentView(R.layout.activity_webview);

以下是我的解决方案

 /**
  * 自定义弹窗 ,提示用户正在截图
  */
protected void createWebCapture(WebView webView) {
    //初始化弹窗
    final ProgressDialog pd = new ProgressDialog(this);
    //设置标题
    pd.setTitle(R.string.text_capturing);
    //设置不可取消
    pd.setCancelable(false);
    //弹窗显示
    pd.show();
    //异步线程 调用截图方法
    new Handler().postDelayed(() -> createType2(webView, pd), 500);
}

/**
 * 截图初始化
 * webView: 控件
 * pd: 弹窗
 */
private void  createType1(WebView webView,ProgressDialog pd) {
    //设置画布为webView
    Picture picture = webView.capturePicture();
    int width = picture.getWidth();
    int height = picture.getHeight();
    Bitmap bitmap = null;
    if (width > 0 && height > 0) {
       bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
       Canvas canvas = new Canvas(bitmap);
       picture.draw(canvas);
    }
    try {
       saveImageToGallery(this, bitmap, true);
       bitmap.recycle();
    } catch (Exception e) {
       Log.e("ShowArtActivity",e.getMessage());
    }
    if (pd != null && pd.isShowing()) {
       Toast.makeText(ShowArtActivity.this, "图片保存成功", Toast.LENGTH_LONG).show();
       pd.dismiss();
    }
}

    /**
     * 捕获Web视图
     * @param webView  web视图
     * @param pd 弹窗
     */
    private void createType2(WebView webView,ProgressDialog pd) {
        float scale = webView.getScale();
        int webViewHeight = (int) (webView.getContentHeight() * scale + 0.5);
        Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webViewHeight, Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        webView.draw(canvas);
        try {
            saveImageToGallery(this, bitmap, true);
            bitmap.recycle();
        } catch (Exception e) {
            Log.e("ShowArtActivity",e.getMessage());
        }
        if (pd != null && pd.isShowing()) {
            Toast.makeText(ShowArtActivity.this, "图片保存成功", Toast.LENGTH_LONG).show();
            pd.dismiss();
        }
    }
最后修改:2022 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏