Android原生WebView截图

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

初始化WebView自适应显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 自适应
* @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以下版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 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实例被创建前加入代码:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* 单图
* 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;
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :