截屏源代码
在Android开发中,截屏功能是一项常见的需求,用于获取设备屏幕当前显示的内容。将详细介绍两种截屏的方法:一种是包含标题栏的全屏截图,另一种则是不包含标题栏的应用内截图。我们来讨论如何实现包含标题栏的全屏截图。在Android中,系统提供了WindowManager
和View
类来帮助我们完成这一任务。我们需要获取到根布局(通常是DecorView
),它是所有应用视图的父容器,包括标题栏。然后,调用draw()
方法绘制整个视图到一个Bitmap
对象。下面是一段示例代码:
//获取根布局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
对象。之后,步骤与全屏截图类似,只是不包含标题栏的截图需要手动裁剪掉顶部的空间。这里有一个简化版的示例:
//获取当前活动的Window window = activity.getLocalActivityManager().getWindow(activity.getCurrentActivityToken());
//获取应用内容部分的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()
方法用于获取状态栏的高度,代码如下:
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应用中实现截屏功能,无论是包含标题栏的全屏截图还是不包含标题栏的应用内截图。这些方法可以帮助开发者在需要时快速地获取屏幕快照,便于调试、分享或进行其他定制操作。在实际开发中,需要注意权限问题,如读写外部存储的权限,并根据设备特性适配不同的屏幕尺寸和分辨率。
相关资源:
下载地址
用户评论
不错,第一种成功,第二种方法貌似行不通,截图有问题,不过有一种就够了