Android原生WebView截图

Android原生WebView截图,以Android 5.0为版本分界线,截图采用不同的处理方式。

初始化WebView自适应显示

/**
 * 自适应
 * @param webView
 */
public static void initWebViewWithOverview(WebView webView) {
    //支持JavaScript
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    //扩大比例的缩放
    webSettings.setUseWideViewPort(true);
    //设置可以支持缩放
    webSettings.setSupportZoom(true);
    //设置出现缩放工具
    webSettings.setBuiltInZoomControls(true);
    //自适应屏幕
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
    webSettings.setLoadWithOverviewMode(true);
    //不显示水平滚动条
    webView.setHorizontalScrollBarEnabled(false);
    //不显示垂直滚动条
    webView.setVerticalScrollBarEnabled(false);
}

Android 5.0以下版本

/**
 * Android5.0以下版本
 * 对WebView进行截屏,虽然使用过期方法,但在当前Android版本中测试可行
 * @param webView
 * @return
 */
private static Bitmap captureWebViewKitKat(WebView webView) {
    Picture picture = webView.capturePicture();
    int width = picture.getWidth();
    int height = picture.getHeight();
    if (width > 0 && height > 0) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        picture.draw(canvas);
        return bitmap;
    }
    return null;
}

Android 5.0及以上版本

在Android 5.0及以上版本,Android对WebView进行了优化,为了减少内存使用和提高性能,使用WebView加载网页时只绘制显示部分。如果我们不做处理,仍然使用上述代码截图的话,就会出现只截到屏幕内显示的WebView内容,其它部分是空白的情况。

通过调用WebView.enableSlowWholeDocumentDraw()方法可以关闭这种优化,但要注意的是,该方法需要在WebView实例被创建前就要调用,否则没有效果。所以我们在WebView实例被创建前加入代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    android.webkit.WebView.enableSlowWholeDocumentDraw();
}

根据Google文档中描述,capturePicture()方法已不推荐使用,推荐我们通过WebView的onDraw(Canvas)去获取图像,所以我们拿到网页的宽高后,即可调用WebView.draw(Canvas)方法生成webView截图。

/**
 * 单图
 * Android5.0及以上版本
 * @param webView
 * @return
 */
private static Bitmap captureWebViewLollipop(WebView webView) {
    int width = webView.getWidth();
    int height = webView.getHeight();
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    webView.draw(canvas);
    return bitmap;
}

/*
private static Bitmap captureWebViewLollipop(WebView webView) {
    float scale = webView.getScale();
    int width = webView.getWidth();
    int height = (int) (webView.getContentHeight() * scale + 0.5);
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    webView.draw(canvas);
    return bitmap;
}
*/

/**
 * 长图
 * 解决5.0+上,截取的快照只显示WebView中显示出来的部分,没有显示出来的部分是空白的
 * @param webView
 * @return
 */
public static Bitmap captureLongWebViewLollipop(WebView webView){
    int height = webView.getContentHeight();
    int width = webView.getWidth();
    int pH = webView.getHeight();
    Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bm);
    int top = height;
    while (top > 0) {
        if (top < pH) {
            top = 0;
        } else {
            top -= pH;
        }
        canvas.save();
        canvas.clipRect(0, top, width, top + pH);
        webView.scrollTo(0, top);
        webView.draw(canvas);
        canvas.restore();
    }
    return bm;
}

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/11/screenshot-of-android-native-webview/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android原生WebView截图
Android原生WebView截图,以Android 5.0为版本分界线,截图采用不同的处理方式。 初始化WebView自适应显示 /** * 自适应 * @param webView */ public stat……
<<上一篇
下一篇>>
文章目录
关闭
目 录