结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
picture.draw(canvas);
return bitmap;
}
return null;
}
}
2. Android5.0及以上版本
在Android5.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
截图。
private void 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;
}
二、X5内核截取长图
使用X5内核截取长图有两种方法,并且都可以不用考虑版本问题,这为我们提供了方便。在X5内核下,如果使用WebView
的onDraw(Canvas)
方法,会出现或多或少的问题,所以对这个方法弃坑了。以下是两个截图方法:
1. 使用X5内核方法snapshotWholePage(Canvas, boolean, boolean)
在X5内核中提供了一个截取整个WebView
界面的方法snapshotWholePage(Canvas, boolean, boolean)
,但是这个方法有个缺点,就是不以屏幕上WebView
的宽高截图,只是以WebView
的contentWidth
和contentHeight
为宽高截图,所以截出来的图片会不怎么清晰,但作为缩略图效果还是不错了。
private static Bitmap captureX5WebViewUnsharp(Context context, WebView webView) {
if (webView == null) {
return null;
}
if (context == null) {
context = webView.getContext();
}
int width = webView.getContentWidth();
int height = webView.getContentHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
webView.getX5WebViewExtension().snapshotWholePage(canvas, false, false);
return bitmap;
}
2. 使用capturePicture()
截取清晰长图
如果想要在X5内核下截到清晰的长图,不能使用snapshotWholePage()
,依然可以采用capturePicture()
。X5内核下使用capturePicture()
进行截图,可以直接拿到WebView
的清晰长图,但这是个Deprecated
的方法,使用的时候要做好异常处理。
三、总结
以上是WebView
截长图方法的总结和分享,对X5内核的截图也是尝试了多种途径最后找到满意的解决方案。另外,截长图会占用大量内存,容易触发OOM,所以代码中也要注意对OOM的处理。
在使用了X5内核的项目中,使用WebView
截取长图的判断逻辑可以是:
// 有x5内核没有生效,并且Android版本是5.0及以上时,调用enableSlowWholeDocumentDraw()方便截取长图
if (!isX5Enabled() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
t/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
[外链图片转存中…(img-0Io5FdDm-1715664572786)]