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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论