关于使用getDrawingCache()方法获取屏幕截图的问题

本文介绍了一种使用Android的getDrawingCache()方法实现屏幕截图的方法,并针对控件较多时出现的内容缺失问题提供了解决方案。

说到android的屏幕截图,一般都会用到getDrawingCache()获取视图缓存来实现.

1.本人当初为了方便想到了使用activity的window中的最顶层DecorView
的ceche进行屏幕截图

			View decorView = activity.getWindow().getDecorView();
			decorView.setDrawingCacheEnabled(true);
			Bitmap bmp = decorView.getDrawingCache();

			Rect rect = new Rect();
			decorView.getWindowVisibleDisplayFrame(rect);
			int statusBarHeight = rect.top;

			int width = bmp.getWidth();
			int height = bmp.getHeight();

			Bitmap saveBmp = Bitmap.createBitmap(bmp, 0, statusBarHeight,
					width, height - statusBarHeight, null, false);

后来发现上述代码所实现的方式,会在view控件过多的页面,cache出现内容缺失不完整。

2.修正方案是直接获取DecorView以下的最顶层布局view的cache。

view.destroyDrawingCache();
			view.setDrawingCacheEnabled(true);
			view.buildDrawingCache();
			Bitmap mBitmap  = view.getDrawingCache();




在 Android 14 设备上获取屏幕截图可以通过多种方式实现,具体取决于使用场景和需求。以下是几种常见的方法: ### 1. 通过代码获取当前 Activity 的屏幕截图 可以使用 `View` 的 `getDrawingCache()` 方法获取当前界面的截图。以下是一个简单的实现方法: ```java public static Bitmap captureScreen(Activity activity) { activity.getWindow().getDecorView().setDrawingCacheEnabled(true); Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache(); return bmp; } ``` 该方法适用于获取当前 Activity 的截图,但需要注意的是,如果界面包含复杂的动画或 OpenGL 渲染内容,可能会导致截图完整或黑屏[^4]。 ### 2. 通过代码获取带有特定裁剪的屏幕截图 对于需要去除状态栏的截图需求,可以通过以下方式实现: ```java public Bitmap myShot(Activity activity) { // 获取 windows 中最顶层的 view View view = activity.getWindow().getDecorView(); view.buildDrawingCache(); // 获取状态栏高度 Rect rect = new Rect(); view.getWindowVisibleDisplayFrame(rect); int statusBarHeights = rect.top; Display display = activity.getWindowManager().getDefaultDisplay(); // 获取屏幕宽和高 int widths = display.getWidth(); int heights = display.getHeight(); // 允许当前窗口保存缓存信息 view.setDrawingCacheEnabled(true); // 去掉状态栏 Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeights, widths, heights - statusBarHeights); // 销毁缓存信息 view.destroyDrawingCache(); return bmp; } ``` 该方法能够有效地排除状态栏,从而获取更干净的截图内容[^1]。 ### 3. 保存截图到本地 SD 卡 获取截图后,可以将截图保存到本地存储中,以便后续使用。以下是一个将截图保存到 SD 卡的实现方法: ```java private void saveToSD(Bitmap bmp, String dirName, String fileName) throws IOException { // 判断 sd 卡是否存在 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dir = new File(dirName); // 判断文件夹是否存在,存在则创建 if (!dir.exists()) { dir.mkdir(); } File file = new File(dirName + fileName); // 判断文件是否存在,存在则创建 if (!file.exists()) { file.createNewFile(); } FileOutputStream fos = null; try { fos = new FileOutputStream(file); if (fos != null) { // 第一参数是图片格式,第二个是图片质量,第三个是输出流 bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); // 用完关闭 fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ``` 此方法会将截图以 PNG 格式保存到指定路径,适用于需要长期保存截图内容的场景[^5]。 ### 4. 使用系统截图功能(非编程方式) 在 Android 14 设备上,用户可以通过系统快捷键进行截图。例如,使用 `Power + Volume Down` 键组合触发截图功能。系统截图功能通常能够自动识别屏幕内容并生成完整的截图。 ### 5. 通过 `MediaProjection` API 进行屏幕录制或截图 如果需要更高权限的截图功能(例如跨应用截图),可以使用 `MediaProjection` API。这种方式通常用于屏幕录制或远程控制等场景。需要通过 `startActivityForResult` 启动权限请求,并在回调中获取 `MediaProjection` 实例。该方法较为复杂,适用于特定的高级需求[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值