【Android】多种方式实现截图(屏幕截图、控件截图、长图)

目录

  • 1. View截图
  • 2. WebView截图
  • 3. 屏幕截图
  • 格式转换方法

Android 截图主要为四种:View 截图、WebView 截图、屏幕截图、系统截图和 adb 截图。后两种截图不常用,不详细展开。

1. View截图

可以截取到View不可见的部分,生成长图,状态栏和导航栏无法截到

fun screenshotView(view: ViewGroup):Bitmap?{var h = 0var bitmap:Bitmap?=nullfor(i in 0 until view.childCount){h += view.getChildAt(i).heightview.getChildAt(i).setBackgroundColor(Color.parseColor("#6CC287"))}bitmap = Bitmap.createBitmap(view.width, h, Bitmap.Config.RGB_565)val canvas = Canvas(bitmap)view.draw(canvas)//重新赋色for(i in 0 until view.childCount){view.getChildAt(i).setBackgroundDrawable(null)}return bitmap
}

2. WebView截图

// 1.capturePicture方法废弃
// 2.getScale方法废弃// 3.getDrawingCache方法
private static byte[] screenshotWebView() {Bitmap bitmap = webView.getDrawingCache();byte[] drawByte = getBitmapByte(bmp);return drawByte;
}// 4.draw方法
private static byte[] screenshotWebView() {// webView.setDrawingCacheEnabled(true); 设置缓存Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);webView.draw(canvas);webView.destroyDrawingCache();byte[] drawByte = getBitmapByte(bitmap);return drawByte;
}

可能会截取不到 cavans 元素,原因是开启了硬件加速(关闭硬件加速可能导致页面异常),可在 AndroidManifest.xml 中设置:

android:hardwareAccelerated="false"

截长图的话需要配置:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {WebView.enableSlowWholeDocumentDraw();
}
setContentView(R.layout.webview);

3. 屏幕截图

截取应用当前屏幕的图片:

	/*** 获取当前屏幕截图,包含状态栏** @param activity activity* @return Bitmap*/public static Bitmap captureWithStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap ret = Bitmap.createBitmap(bmp, 0, 0, width, height);view.destroyDrawingCache();return ret;}/*** 获取当前屏幕截图,不包含状态栏** @param activity activity* @return Bitmap*/public static Bitmap captureWithoutStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();int statusBarHeight = getStatusBarHeight(activity);int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap ret = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);view.destroyDrawingCache();return ret;}/*** 得到屏幕的高** @param context* @return*/public static int getScreenHeight(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int height = wm.getDefaultDisplay().getHeight();return height;}/*** 得到屏幕的宽** @param context* @return*/public static int getScreenWidth(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();return width;}/*** 获取状态栏高度** @param context 上下文* @return 状态栏高度*/public static int getStatusBarHeight(Context context) {int result = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {result = context.getResources().getDimensionPixelSize(resourceId);}return result;}

格式转换方法

// Bitmap 转 Base64
private static String getBitmapString(Bitmap bitmap) {String result = null;ByteArrayOutputStream out = null;try {if (bitmap != null) {out = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
​out.flush();out.close();byte[] bitmapBytes = out.toByteArray();result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);}} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.flush();out.close();}} catch (IOException e) {e.printStackTrace();}}return result;
}// Bitmap 转 Byte
private static byte[] getBitmapByte(Bitmap bitmap){ByteArrayOutputStream out = new ByteArrayOutputStream();// 转换类型,压缩质量,字节流资源bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);try {out.flush();out.close();} catch (IOException e) {e.printStackTrace();}return out.toByteArray();
}// Drawable 转 Bitmap
public static Bitmap toBitmap(Drawable drawable) {if (drawable instanceof BitmapDrawable) {return ((BitmapDrawable) drawable).getBitmap();} else if (drawable instanceof ColorDrawable) {//colorBitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);canvas.drawColor(((ColorDrawable) drawable).getColor());return bitmap;} else if (drawable instanceof NinePatchDrawable) {//.9.pngBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());drawable.draw(canvas);return bitmap;}return null;
}

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

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

相关文章

docker官方源无法使用的解决办法

使用官方源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 安装docker报错 Loaded plugins: fastestmirror, priorities Loading mirror speeds from cached hostfile https://download.docker.com/linux/centos/7/x86_64/stable/re…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》:开放结局,无限遐想 当刘亦菲再次踏入荧屏,与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员,更以其独特的剧情和精致的制作成为了近期热门的话题。《…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据,并打印 2、客户端…

cad批量打印pdf怎么弄?介绍三种打印方法

cad批量打印pdf怎么弄?在CAD设计领域,批量打印PDF文件是一项常见且至关重要的任务。面对大量的CAD图纸,如何高效地进行转换和打印,成为了设计师们亟待解决的问题。今天,我们就来推荐三款能够批量打印PDF的CAD软件&…

最新扣子(Coze)实战案例:扣子卡片的制作及使用,完全免费教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》,完全免费学习。 👀 关注斜杠君,可获取完整版教程。👍&#x1f3f…

面对不断变化的安全标准和威胁,Cobol 程序应采取哪些措施来加强其安全性和防护能力?

面对不断变化的安全标准和威胁,Cobol 程序可以采取以下措施来加强其安全性和防护能力: 更新和升级:定期更新和升级Cobol编译器和开发环境,以获取最新的安全性改进和修补程序。 安全审计:定期进行安全审计,…

对红酒数据集,分别采用决策树算法和随机森林算法进行分类。

1.导入所需要的包 from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split 2.导入数据,并且对随机森林和决策数进…

深入解析Spring Cloud的常用插件和注解(下)

在上一篇文章中,我们介绍了Spring Cloud的一些常用插件及其配置和使用。本文将继续探讨Spring Cloud的常用注解及其在实际开发中的应用。 2. Spring Cloud的常用注解 2.1 EnableEurekaServer 该注解用于启动一个Eureka Server,使得其他微服务可以注册…

后端程序员的Linux命令指南

后端程序员的终极命令指南:考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫,常年抱着键盘睡觉的后端小伙伴们👋👋👋!今天,考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

关于微信小程序取消获取用户昵称的一些思考

官方说明,有部分小程序乱用授权,强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 ,微信头像经常是本人真是照片,在现在人工智能算法的加持下,人脸数据太容易被套取。 其二,微信名称同理&…

Gobject tutorial 九

The GObject messaging system Closures closure是一个抽象、通用的概念,它包含一个函数和一些变量。作用就是实现函数回调功能。 我们看看GLib对closure是怎么定义的。 /*** GClosure:* in_marshal: Indicates whether the closure is currently being invoked…

pip install镜像源(更新和换源)

pip install镜像源(更新和换源) 1.pip安装依赖包默认访问的源: 因为服务器架设在国外的缘故,很多时候不好用网速不行,这时候就需要选择国内的一些安装源安装相应的包 https://pypi.Python.org/simple/2.设置默认源 …

【React】useState 更新延迟的原因是什么,怎么解决?

useState 更新延迟的原因 异步更新:React 中的 useState 更新是异步的,这意味着当你调用更新函数(如 setData)时,React 并不立即同步更新状态,而是将其放入一个待处理的队列中,稍后在适当的时候(如在下一次渲染之前)进行处理。因此,如果你尝试在调用更新函数后立即读…

CVPR 2024第三弹:小编与李飞飞教授惊喜同框,CVPR之家乐队火爆演奏惊艳全场

CVPR 2024第三弹:小编与李飞飞教授惊喜同框,"CVPR之家"乐队火爆演奏惊艳全场! 会议之眼 快讯 2024 年 CVPR (Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议,于6月1…

最新评测:2024年13款国内外缺陷跟踪管理工具(含免费/开源)

文章中介横向对比了11款主流缺陷管理工具:1. PingCode;2. Worktile;3. Jira;4. ZenTao(禅道);5. Bugzilla;6. Redmine;7. Tapd;8. MantisBT;9. Tr…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

python项目生成词云图的时候报错:AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’ 解决办法 出现这个问题,可能是因为Pillow版本过高导致的,我们可以尝试通过降低Pillow的版本来解决它。 我通过将Pillow版本降低到9.4.…

贴图法美化Button按钮

贴图法美化Button按钮 项目是在下面这篇文章里的基础上进行美化的:MFC实现INI配置文件的读取 1. 初始效果 2.最终效果 3. 增加 CImgButton 类 1.1 ImgButton.h 头文件 #pragma once // CImgButtonclass CImgButton : public CBitmapButton {DECLARE_DYNAMIC(CImgBu…

游戏本地化以拓展海外市场

Logrus IT Korea的总监元庆燕(KyoungYeon Won)发表了一场关于“游戏本地化”的讲座,讲述了独立游戏开发者如何在梦想拓展海外市场的过程中,正确地本地化他们的游戏以满足国际市场的期望,以及实现这一重要任务的过程。 …

NFS环境部署

服务端 1.是否安装过 rpm -qa nfs-utils rpcbbind 2.安装 创建共享文件夹更改文件夹用户和组给文件夹赋权限 yum install -y nfs-utils rpcbbind # mkdir -p /mnt/data/localnfs/ # chown -R nfsnobody:nfsnobody /mnt/data/localnfs/ # chmod 766 /mnt/data/localnfs/ 3.修改…

注解详解系列 - @ResponseStatus

注解简介 在今天的每日一注解中,我们将探讨ResponseStatus注解。ResponseStatus是Spring框架中的一个注解,用于为控制器方法指定HTTP响应状态码和理由短语。 注解定义 ResponseStatus注解用于标记控制器方法或异常类,以指示HTTP响应的状态码…