android中Webview实现截屏三种方式小结
发布时间 - 2026-01-10 23:29:08 点击率:次本人最近学习了android中Webview实现截屏三种方式,下面我来记录一下,有需要了解的朋友可参考。希望此文章对各位有所帮助。

第一种方式
通过调用webview.capturePicture(),得到一个picture对象,根据图像的宽和高创建一个Bitmap,再创建一个canvas,绑定bitmap,最后用picture去绘制。
//获取Picture对象
Picture picture = wv_capture.capturePicture();
//得到图片的宽和高(没有reflect图片内容)
int width = picture.getWidth();
int height = picture.getHeight();
if (width > 0 && height > 0) {
//创建位图
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//绘制(会调用native方法,完成图形绘制)
picture.draw(canvas);
}
这种方式可以获取webview中已加载的所有数据图像,也就是长截屏的效果。这种方式在Android 4.4以下是没有问题的,但是在5.0以上就行不通了。capturePicture()方法在4.4中废弃掉了,官方建议使用onDrow()方法来获取webview的bitmap快照。具体实现如下:
//获取webview缩放率 float scale = wv_capture.getScale(); //得到缩放后webview内容的高度 int webViewHeight = (int) (wv_capture.getContentHeight()*scale); Bitmap bitmap = Bitmap.createBitmap(wv_capture.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //绘制 wv_capture.draw(canvas);
但是此时在5.0+上会发现,截取的快照只显示了webview中显示出来的那部分,没有显示出来的部分是空白的。通过google找到了原因,在5.0+版本上,Android对webview做了优化,旨在减少内存占用以提高性能。因此在默认情况下会智能的绘制html中需要绘制的部分,其实就是当前屏幕展示的html内容,因此会出现未显示的图像是空白的。解决办法是调用enableSlowWholeDocumentDraw()方法。这个方法需要在webview创建之前调用,在Activity里就是在setContentView前去调用,此方法会有显著的性能开销。
这里需要注意的是在传递webview的高度时,是通过缩放率计算的,这样就会算出绘制整个已加载的html内容所需的高度。如果没有这个缩放率,那么得到的快照就仅仅是这个html内容最上面的那一段。还有一个问题就是在5.0+系统上得到快照比较模糊,在其他版本上没有问题,不知道原因何在?
第二种方式
利用view的缓存功能。Android为了提高滚动等各方面的绘制速度,可以为每一个view建立一个缓存,使用 View.buildDrawingCache为自己的view建立相应的缓存, 这个cache就是一个bitmap对象。利用这个功能可以对整个屏幕视图进行截屏并生成Bitmap,也可以 获得指定的view的Bitmap对象。
因此对于webview来说也可以使用这种方式,在使用getDrawingCache()方法获取bitmap对象前,先开启webview的缓存功能.
webView.setDrawingCacheEnabled(true); ... Bitmap bitmap = webView.getDrawingCache();
需要注意的是,在上述情况下,这个缓存bitmap对象只有一个,因此每次获取的bitmap指向的是同一块地址空间的缓存对象,如果在使用完bitmap后就立即回收掉这个对象,那么再次获取当前view的缓存对象时就会得到null。所以要在Activity销毁时进行回收,所以开启缓存的话会有性能开销。
第三种方式
比较简单,通过获取当前window的DecorView,然后绘制Bitmap对象。
View view = context.getWindow().getDecorView();
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
保存到文件
try {
String fileName = Environment.getExternalStorageDirectory().getPath()+"/webview_capture4.jpg";
FileOutputStream fos = new FileOutputStream(fileName);
//压缩bitmap到输出流中
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);
fos.close();
Toast.makeText(WebviewFromGetDecorView.this, "截屏成功", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}finally {
if(bitmap!=null) {
bitmap.recycle();
}
}
具体demo猛戳这里: WebviewCapture_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# webview截屏
# Webview实现截屏
# Android截屏方案实现原理解析
# Android截屏分享功能
# Android 下调试手机截屏的方法
# Android 实现截屏功能的实例
# android长截屏原理及实现代码
# Android实现截屏方式整理(总结)
# Android截屏SurfaceView黑屏问题的解决办法
# Android截屏截图的几种方法总结
# Android 获取浏览器当前分享页面的截屏示例
# Android实现矩形区域截屏的方法
# Android Activity 不能被截屏的解决方法
# 的是
# 会有
# 需要注意
# 自己的
# 情况下
# 加载
# 就会
# 是在
# 就是在
# 我来
# 要在
# 所需
# 就行
# 如果没有
# 还有一个
# 三种
# 仅仅是
# 掉了
# 只有一个
# 只显示
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理异常和错误?(Handler示例)
香港服务器网站卡顿?如何解决网络延迟与负载问题?
简历没回改:利用AI润色让你的文字更专业
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel如何生成URL和重定向?(路由助手函数)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
详解Oracle修改字段类型方法总结
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
黑客入侵网站服务器的常见手法有哪些?
JavaScript如何实现倒计时_时间函数如何精确控制
制作电商网页,电商供应链怎么做?
如何快速生成可下载的建站源码工具?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何用PHP快速搭建高效网站?分步指南
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
详解vue.js组件化开发实践
无锡营销型网站制作公司,无锡网选车牌流程?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何实现本地化和多语言支持?(i18n教程)
*服务器网站为何频现安全漏洞?
js实现点击每个li节点,都弹出其文本值及修改
进行网站优化必须要坚持的四大原则
如何在企业微信快速生成手机电脑官网?
Python面向对象测试方法_mock解析【教程】
Android仿QQ列表左滑删除操作
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
原生JS实现图片轮播切换效果
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
微信小程序 wx.uploadFile无法上传解决办法
网站建设要注意的标准 促进网站用户好感度!
高防服务器租用如何选择配置与防御等级?
Laravel Fortify是什么,和Jetstream有什么关系
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
英语简历制作免费网站推荐,如何将简历翻译成英文?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
HTML 中动态设置元素 name 属性的正确语法详解
微信小程序制作网站有哪些,微信小程序需要做网站吗?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Android利用动画实现背景逐渐变暗

