截屏源代码
在Android开发中,截屏功能是一项常见的需求,用于获取设备屏幕当前显示的内容。本文将详细介绍两种截屏的方法:一种是包含标题栏的全屏截图,另一种则是不包含标题栏的应用内截图。 我们来讨论如何实现包含标题栏的全屏截图。在Android中,系统提供了`WindowManager`和`View`类来帮助我们完成这一任务。我们需要获取到根布局(通常是`DecorView`),它是所有应用视图的父容器,包括标题栏。然后,调用`draw()`方法绘制整个视图到一个`Bitmap`对象。下面是一段示例代码: ```java // 获取根布局 View decorView = activity.getWindow().getDecorView(); decorView.setDrawingCacheEnabled(true); decorView.buildDrawingCache(); // 创建Bitmap对象 Bitmap bitmap = decorView.getDrawingCache(); // 获取屏幕尺寸 DisplayMetrics displayMetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); // 将Bitmap保存为图片文件 FileOutputStream outStream = null; try { File screenshotFile = new File(Environment.getExternalStorageDirectory(), "screenshot.png"); outStream = new FileOutputStream(screenshotFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); } catch (IOException e) { e.printStackTrace(); } finally { if (outStream != null) { try { outStream.close(); } catch (IOException e) { e.printStackTrace(); } } decorView.setDrawingCacheEnabled(false); // 清除缓存 } ``` 接下来,我们来看如何实现不包含标题栏的应用内截图。在某些情况下,我们可能只需要截取应用当前活动的部分,而不包括系统标题栏。这时,我们可以使用`Activity`的`getLocalActivityManager()`方法获取到`LocalActivityManager`,然后调用其`getWindow()`方法得到当前活动的`Window`对象。之后,步骤与全屏截图类似,只是不包含标题栏的截图需要手动裁剪掉顶部的空间。这里有一个简化版的示例: ```java // 获取当前活动的Window Window window = activity.getLocalActivityManager().getWindow(activity.getCurrentActivityToken()); // 获取应用内容部分的View View contentRootView = window.getDecorView().findViewById(android.R.id.content); // 同样先绘制到Bitmap contentRootView.setDrawingCacheEnabled(true); contentRootView.buildDrawingCache(); Bitmap appBitmap = contentRootView.getDrawingCache(); // 获取屏幕高度和内容区域高度 int statusBarHeight = getStatusBarHeight(activity); int contentHeight = contentRootView.getHeight(); // 裁剪掉标题栏,保存图片 try { Bitmap croppedBitmap = Bitmap.createBitmap(appBitmap, 0, statusBarHeight, appBitmap.getWidth(), contentHeight - statusBarHeight); // ... 保存图片的逻辑 } catch (Exception e) { e.printStackTrace(); } finally { contentRootView.setDrawingCacheEnabled(false); } ``` 在这个过程中,`getStatusBarHeight()`方法用于获取状态栏的高度,代码如下: ```java public static int getStatusBarHeight(Context context) { int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); return resourceId > 0 ? context.getResources().getDimensionPixelSize(resourceId) : 0; } ``` 通过上述代码,我们可以在Android应用中实现截屏功能,无论是包含标题栏的全屏截图还是不包含标题栏的应用内截图。这些方法可以帮助开发者在需要时快速地获取屏幕快照,便于调试、分享或进行其他定制操作。在实际开发中,需要注意权限问题,如读写外部存储的权限,并根据设备特性适配不同的屏幕尺寸和分辨率。
- 1
- 修炼中的小白2016-10-09很好的资料,很齐全,谢谢.
- qugengting2017-03-13不错,第一种成功,第二种方法貌似行不通,截图有问题,不过有一种就够了
- lwj4283192015-11-24不成功,还是歇息诶楼主分享
- 粉丝: 15
- 资源: 44
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助