Android开发中,有时候需要截取屏幕,这个时候会产生一个问题。如果我不需要整个的屏幕,只需要单个区域的内容怎么处理?

一开始想到的是先截取整个屏幕,然后进行裁剪。但这样太麻烦了,直到我发现了DrawingCache这个东西。下面就来分享一下,如何用DrawingCache实现截取部分屏幕区域的功能

Android的所有空间都是继承View类的,而在View类里其实就已经提供了截取自身位图的功能。我们可以通过得到View的位图实现截取屏幕部分区域的功能。主要有下面几个方法,我会一一介绍

void  setDrawingCacheEnabled(boolean flag),//开启图片缓存,内部调用了buildDrawingCache方法

Bitmap  getDrawingCache(boolean autoScale),//获取缓存图片

void  buildDrawingCache(boolean autoScale),//重建图片缓存,内部调用destroyDrawingCache对原来的图片缓存进行销毁

void  destroyDrawingCache(),//销毁图片缓存

具体使用有以下两种方式

第一种

view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

原理讲解如下:

setDrawingCacheEnabled(true)内部调用了buildDrawingCache()方法重建了图片缓存

因为DrawingCache得到的位图在禁用后会被回收,所以需要通过Bitmap.createBitmap()进行一个备份

获取缓存会占用一定内存,所以最后有必要进行清理。setDrawingCacheEnabled(false)内部调用destroyDrawingCache()方法进行了清理

第二种

view.buildDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.destroyDrawingCache();

这种可以理解为上一种的核心代码,由此可见,获取View图片缓存的步骤主要如下

构建——得到并且缓存——销毁

最后需要注意!!!

在onCreate方法里View还没有初始化自己的宽高,

所以getDrawingCache()方法返回空。

也就是说在这里是无法得到控件的图片的

补充:

最近发现这些方法都已经被标记为过时方法了。

但是没关系,现在有新的方式截取View的图片,方法如下:

private Bitmap loadBitmapFromView(View v) {if (v == null) {return null;}Bitmap screenshot;screenshot = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);Canvas c = new Canvas(screenshot);c.translate(-v.getScrollX(), -v.getScrollY());//这句好像可以不加v.draw(c);return screenshot;
}

(原创)通过DrawingCache截取View图片相关推荐

  1. C#实现网页加载后将页面截取成长图片 | Playwright版

    前言 如何将网页生成预览图? 要实现这个功能,可以用WebBrowser组件模拟浏览器,或者使用系统浏览器访问网页,再进行截图操作. 但是,这样需要编写大量的控制代码. 工欲善其事,必先利其器! 利用 ...

  2. jquery实现截取pc图片_Cropper.js 实现裁剪图片并上传(PC端)

    由于之前做项目的时候有需求是需要实现裁剪图片来做头像并上传到服务器,所以上网查询了很多资料,也试用了许多案例,发现cropper插件裁剪是比较完善的,所以结合之前的使用情况,编写了此案例.本案例是参考 ...

  3. php 截取图片大小,PHP截取指定图片大小的方法

    这篇文章主要介绍了PHP截取指定图片大小的方法,可实现对指定图片的缩放与截取功能,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了PHP截取指定图片大小的方法.分享给大家供大家参考.具体分析如下 ...

  4. jquery实现截取pc图片_jquery 上传图片自由截取

    为了使用户能自定义个人头像,需要提供一个对上传图片的截图功能,当前很多网站特别是SNS类网站都提供这样的功能,非常实用.本文主要是利用jQuery的imgAreaSelect插件实现. 首先引入三个文 ...

  5. Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹

    Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹 目录 实现步骤和结果 核心代码 实现步骤和结果 ...

  6. selenium截取验证码图片

    # 截取验证码图片 from PIL import Image driver.save_screenshot('bdbutton.png') element = driver.find_element ...

  7. python测试脚本截图_Python+selenium实现截图图片并保存截取的图片

    这篇文章介绍如何利用Selenium的方法进行截图,在测试过程中,是有必要截图,特别是遇到错误的时候进行截图.在selenium for Python中主要有三个截图方法,我们挑选其中最常用的一种. ...

  8. 通过cv2.VideoCapture完成跳帧截取视频图片

    学习python-opencv视频读取类 通过cv2.VideoCapture完成跳帧截取视频图片,其中: ret, frame = cv2.VideoCapture.read() 函数输出的是两个参 ...

  9. C# 模拟PrintScreen 和 Alt+PrintScreen截取屏幕图片

    C# 模拟PrintScreen 和 Alt+PrintScreen截取屏幕图片 keybd_event API 函数功能:该函数合成一次击键事件.系统可使用这种合成的击键事件来产生WM_KEYUP或 ...

最新文章

  1. [LUOGU] P2330 [SCOI2005]繁忙的都市
  2. java on RHEL5
  3. 半年总结(2018-10)
  4. SDK 和 API 的区别是什么?
  5. ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解
  6. phpcms v9 的表单向导功能的使用方法
  7. 基于.NET Core的优秀开源项目合集
  8. .NET 异步详解(更新)
  9. PHPExcel读取excel文件
  10. 整合SQL Server 2012和2014
  11. php中三元运算符用法
  12. ucos信号量集源码分析
  13. Apache --Tomcat 8下载与配置(Tomcat压缩包下载 Windows 7 x64)
  14. 经验分享:使用谷歌浏览器下载想要的任意网页视频/音乐的方法
  15. 普通文本与富文本,超文本之间的区别
  16. 初学者学Python必看的几个练手小项目,轻松不枯燥哦
  17. 支付宝APP支付申请配置过程详解
  18. 【SSLGZ 2811】2017年10月30日提高组T2 摘Galo
  19. Windows 在目录中搜索哪个文件中有指定字符串
  20. 深入理解先验分布、后验分布、似然估计

热门文章

  1. SystemVerilog学习-02-数据类型
  2. Arrays及Array
  3. 单片机实现延时两种方法
  4. 架构:安全架构——信息过滤与反垃圾、风险控制。
  5. Barrier类介绍
  6. ubuntu网络无法连接
  7. windows更改密码脚本_如何更改您的Windows密码
  8. 镜头焦距与视野的计算
  9. 创始人如何设置公司股权结构?
  10. Training generative adversarial networks with limited data.