Android控件WebView实现完整截图

news2024/9/22 11:36:26

最近总能看到好多APP都支持文章和网页的长截图,出于好奇研究了一下,分享给大家。

网上有好多的例子,其中好多都是已经过时的就不在复述了,我发现有一种还是比较通用的方法。

//android 5.0 之后需要开启浏览器的整体缓存才能截取整个Web
if (Build.VERSION.SDK_INT  = Build.VERSION_CODES.LOLLIPOP) {
  WebView.enableSlowWholeDocumentDraw();
}

首先需要在WebView初始化之前(一般就是setContentView()方法调用之前)调用WebView的enableSlowWholeDocumentDraw()方法,开启WebView的Html缓存。因为在Android5.0之后Android系统上为了提升性能,在WebView增加了一个只渲染当前可见的Html的Document的特性。所以如果不开启这个功能的话我们截图的时候就只能得到部分网页的截图。

**注意:**开启这个功能会提高性能开销。

我先贴一下截图的代码:

public static boolean getFullWebViewSnapshot(WebView webView, String savePath) {
    //重新调用WebView的measure方法测量实际View的大小(将测量模式设置为UNSPECIFIED模式也就是需要多大就可以获得多大的空间)
    webView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    //调用layout方法设置布局(使用新测量的大小)
    webView.layout(0, 0, webView.getMeasuredWidth(), webView.getMeasuredHeight());
    //开启WebView的缓存(当开启这个开关后下次调用getDrawingCache()方法的时候会把view绘制到一个bitmap上)
    webView.setDrawingCacheEnabled(true);
    //强制绘制缓存(必须在setDrawingCacheEnabled(true)之后才能调用,否者需要手动调用destroyDrawingCache()清楚缓存)
    webView.buildDrawingCache();
    //根据测量结果创建一个大小一样的bitmap
    Bitmap picture = Bitmap.createBitmap(webView.getMeasuredWidth(),
        webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    //已picture为背景创建一个画布
    Canvas canvas = new Canvas(picture); // 画布的宽高和 WebView 的网页保持一致
    Paint paint = new Paint();
    //设置画笔的定点位置,也就是左上角
    canvas.drawBitmap(picture, 0, webView.getMeasuredHeight(), paint);
    //将webview绘制在刚才创建的画板上
    webView.draw(canvas);
    try {
      //将bitmap保存到SD卡
      FileTools.saveBitmap(picture, savePath);
      return true;
    } catch (IOException e) {
      e.printStackTrace();
      return false;
    }
  }

其实很简单,思路是这样的:

  • 通过WebView的measure方法重新测量webview的整个大小;
  • 创建一个bitmap,它的大小和webview的真实大小一样;
  • 将webview绘制到bitmap上;
  • 将bitmap保存到SD卡上;

这样基本能实现一个WebView的整体截图功能。当然还不是很完善,有空再补充一下。

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端程序员入门react笔记(四)-综合运用,写一个小demo

样式模块化 有时候我们会遇到这样的问题,有两个css对一个class声明了样式,这样的话后引入的css会覆盖前面的css样式,导致样式冲突,那么我们怎么解决这种问题呢,我们可以使用样式的模块化,我们起名一个inde…

关于HashMap的面试问题(26问面试题)

文章目录 关于HashMap的面试问题1、HashMap的底层实现2、HashMap的数组的元素类型3、为什么要使用数组?4、HashMap的数组的初始化长度5、HashMap的映射关系的存储索引index如何计算6、HashMap 为什么使用 &按位与运算代替%模运算?7、为什么要使用has…

微服务篇之限流

一、为什么要限流 1. 并发的确大(突发流量)。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数,但是每一个微服务都有一个tomcat,实现起来非常麻烦。 2. Nginx限流 (1)控…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! 解…

路由器的端口映射如何设置?

路由器的端口映射设置是网络连接中常用的配置功能,通过将外部网络访问请求映射到内部设备,实现局域网内设备的远程访问。本文将介绍如何进行路由器的端口映射设置,并以【天联】组网产品为例进行说明。 【天联】组网产品介绍 【天联】组网是一…

jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水线部分代码如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh执行流水线出现报错&#xff1a;Pseudo-terminal will not be allocated because…

汽车制造5G智能工厂数字孪生可视化平台,推进汽车行业数字化转型

汽车制造5G智能工厂数字孪生可视化平台&#xff0c;推进汽车行业数字化转型。在当今数字化时代&#xff0c;汽车行业正面临着前所未有的挑战和机遇。随着5G技术的快速发展&#xff0c;汽车制造正在向智能化、数字化转型&#xff0c;而数字孪生技术作为这一转型的核心驱动力&…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标&#xff0c;系统化的组织起来&#xff0c;通过单点看全局&#xff0c;通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值&#xff0c;它使得业务目标可描述、可度量、可拆解&#xff…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

目录 1 消息队列(Message Queue)简介 1.1 概述 1.2 消息服务中两个重要概念 1.3 消息队列主要有两种形式的目的地 1.4 JMS和AMQP对比 1.5 应用场景 1.6 Spring支持 1.7 SpringBoot自动配置 1.7 市面上的MQ产品 2 RabbitMQ 2.1 RabbitMQ简介 2.1.1 RabbitMQ简介 2…

在UE5中制作UI环形进度条

在日常开发中&#xff0c;经常会有环形进度条UI的效果&#xff0c;例如技能CD时间、加载动画等&#xff0c;本文将通过材质球节点实现该效果&#xff0c;相较于准备美术素材&#xff0c;这样的做法更为方便&#xff0c;效果如下&#xff1a; 1.制作环状效果材质函数 在内容面…

SAP PP学习笔记03 - SAP中如何设定项目选择

上次这篇文章里面讲了界面的字段显示顺序及是否显示的设置。 并做了 事务代码 控制界面显示的例子。 SAP PP学习笔记02 - PP中配置品目Master时的顺序-CSDN博客 那么&#xff0c;每次控制界面显示什么都要这么挨个 这么设置一遍吗&#xff1f; 那岂不得烦死。 其实SAP里面参…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Stable Diffusion——文生图界面参数讲解与提示词使用技巧

Clip终止层数 什么是Clip CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;是由OpenAI于2021年开发的一种语言图像对比预训练模型。其独特之处在于&#xff0c;CLIP模型中的图像和文本嵌入共享相同的潜在特征空间&#xff0c;这使得模型能够直接在图像和文…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码&#xff1a;1688 帧缓冲&#xff08;framebuffer&#xff09;设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer&#xff0c;所以目前在linux环境下开发图形化界面、…

电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法

在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…

java替换jar中的class文件

1、编译好class文件2、找到需要修改class文件的路径3、解压需要替换的文件4、上传编译后的class文件5、重新压缩 在调整java代码过程中会遇到需要改jar包中的class文件的情况&#xff0c;改了如何替换呢&#xff1f; 1、编译好class文件 将需要修改的class文件代码复制到java编…

亿道丨三防平板丨加固平板丨三防加固平板丨改善资产管理

库存资产管理中最重要的部分之一是准确性&#xff1b;过时的库存管理技术会增加运输过程中人为错误、物品丢失或纸张损坏的风险。如今随着三防平板电脑的广泛使用&#xff0c;库存管理也迎来了好帮手&#xff0c;通过使用三防平板电脑能够确保库存管理、数据存储和记录保存的准…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…

Python 光速入门课程

首先说一下&#xff0c;为啥小编在即PHP和Golang之后&#xff0c;为啥又要整Python&#xff0c;那是因为小编最近又拿起了 " 阿里天池 " 的东西&#xff0c;所以小编又不得不捡起来大概五年前学习的Python&#xff0c;本篇文章主要讲的是最基础版本&#xff0c;所以比…

基于springboot+vue的靓车汽车销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…