如何在 Android 中获取 ImageView/any UI 组件后面的区域的 screenshot/bitmap?
How to take a screenshot/bitmap of the area behind an ImageView/any UI component in Android?
假设我有一个 ImageView、Grid 或其他控件。我想要做的是截取此控件背后的屏幕截图,比方说另一个包含背景图像或任何可能存在的控件。有什么办法可以做到这一点?我想到了 getDrawingCache();方法,但这也需要最高控制权。
我想这样做是为了让顶部控件后面的内容具有模糊透明的效果。我已经有一个模糊的方法,我只需要拍摄背景的精确照片。任何帮助将不胜感激!
您可以在任何视图上使用 getDrawingCache()
方法,因此如果您有对背景视图的引用,它应该可以像这样工作:
<your background view>.setDrawingCacheEnabled(true);
Bitmap contentBitmap = Bitmap.createBitmap(<your background view>.getDrawingCache());
<your background view>.setDrawingCacheEnabled(false);
contentBitmap
现在应该包含该视图中内容的位图。
public static Bitmap getViewBitmap(View v) {
v.clearFocus();
v.setPressed(false);
boolean willNotCache = v.willNotCacheDrawing();
v.setWillNotCacheDrawing(false);
// Reset the drawing cache background color to fully transparent
// for the duration of this operation
int color = v.getDrawingCacheBackgroundColor();
v.setDrawingCacheBackgroundColor(0);
if (color != 0) {
v.destroyDrawingCache();
}
v.buildDrawingCache();
Bitmap cacheBitmap = v.getDrawingCache();
if (cacheBitmap == null) {
Log.e(tag, "failed getViewBitmap(" + v + ")", new RuntimeException());
return null;
}
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
// Restore the view
v.destroyDrawingCache();
v.setWillNotCacheDrawing(willNotCache);
v.setDrawingCacheBackgroundColor(color);
return bitmap;
}
假设我有一个 ImageView、Grid 或其他控件。我想要做的是截取此控件背后的屏幕截图,比方说另一个包含背景图像或任何可能存在的控件。有什么办法可以做到这一点?我想到了 getDrawingCache();方法,但这也需要最高控制权。
我想这样做是为了让顶部控件后面的内容具有模糊透明的效果。我已经有一个模糊的方法,我只需要拍摄背景的精确照片。任何帮助将不胜感激!
您可以在任何视图上使用 getDrawingCache()
方法,因此如果您有对背景视图的引用,它应该可以像这样工作:
<your background view>.setDrawingCacheEnabled(true);
Bitmap contentBitmap = Bitmap.createBitmap(<your background view>.getDrawingCache());
<your background view>.setDrawingCacheEnabled(false);
contentBitmap
现在应该包含该视图中内容的位图。
public static Bitmap getViewBitmap(View v) {
v.clearFocus();
v.setPressed(false);
boolean willNotCache = v.willNotCacheDrawing();
v.setWillNotCacheDrawing(false);
// Reset the drawing cache background color to fully transparent
// for the duration of this operation
int color = v.getDrawingCacheBackgroundColor();
v.setDrawingCacheBackgroundColor(0);
if (color != 0) {
v.destroyDrawingCache();
}
v.buildDrawingCache();
Bitmap cacheBitmap = v.getDrawingCache();
if (cacheBitmap == null) {
Log.e(tag, "failed getViewBitmap(" + v + ")", new RuntimeException());
return null;
}
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
// Restore the view
v.destroyDrawingCache();
v.setWillNotCacheDrawing(willNotCache);
v.setDrawingCacheBackgroundColor(color);
return bitmap;
}