在 Android 上保存自定义视图的屏幕截图
Saving a screenshot of a custom view on Android
我正在尝试保存当前 Activity 的屏幕截图,但不是整个视图,只是其中的一部分。
就我而言:
My activity
在附图中,我想保存一个从视图 B、C 和 D 构建的位图。
B为线性布局,C为纯位图,D为相对布局。
据我了解,一种方法是创建一个 canvas,将所有 'elements' 添加到其中,最后得到所需的自定义位图。
我在使用以下代码时遇到问题:
iViewBHeight= viewB.getHeight();
// Prepare empty bitmap as output
Bitmap result = Bitmap.createBitmap(bitmapC.getWidth(),bitmapC.getHeight() + iViewBHeight, Config.ARGB_8888);
// Flush source image into canvas
Canvas canvas = new Canvas(result);
// Draw bitmap C to canvas 'under' view B
canvas.drawBitmap(bitmapC, 0, iViewBHeight, null);
// Draw view B to canvas
viewB.setDrawingCacheEnabled(true);
viewB.buildDrawingCache(true);
canvas.drawBitmap(Bitmap.createBitmap(viewB.getDrawingCache()), 0, 0, null);
viewB.setDrawingCacheEnabled(false);
// Desired bitmap is at 'result'
结果是位图C画好了,但是视图B太大,扩展了位图。
我没有尝试添加视图 D..
谁能帮帮我?也许有更好的方法来实现我的目标?
谢谢!
我认为最简单的方法是截取 Activity
的全部内容,然后截取 A View
。 Canvas#drawBitmap(Bitmap bmp, Rect src, Rect dest, Paint pnt)
重载很容易做到这一点。 Rect src
描述了您正在复制的源 Bitmap
部分,而 dest
是目标 Bitmap
中源将被绘制的部分。(注意: Rect
尺寸不必相同。)
我相信如果我没听错的话,下面的方法应该可以满足您的需求。
private Bitmap capture()
{
View actContent = findViewById(android.R.id.content);
Bitmap result = Bitmap.createBitmap(actContent.getWidth(),
actContent.getHeight() - viewA.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
actContent.setDrawingCacheEnabled(true);
Rect src = new Rect(0, viewA.getHeight(), actContent.getWidth(), actContent.getHeight());
Rect dest = new Rect(0, 0, result.getWidth(), result.getHeight());
canvas.drawBitmap(actContent.getDrawingCache(), src, dest, null);
actContent.setDrawingCacheEnabled(false);
return result;
}
我正在尝试保存当前 Activity 的屏幕截图,但不是整个视图,只是其中的一部分。 就我而言: My activity
在附图中,我想保存一个从视图 B、C 和 D 构建的位图。
B为线性布局,C为纯位图,D为相对布局。
据我了解,一种方法是创建一个 canvas,将所有 'elements' 添加到其中,最后得到所需的自定义位图。
我在使用以下代码时遇到问题:
iViewBHeight= viewB.getHeight();
// Prepare empty bitmap as output
Bitmap result = Bitmap.createBitmap(bitmapC.getWidth(),bitmapC.getHeight() + iViewBHeight, Config.ARGB_8888);
// Flush source image into canvas
Canvas canvas = new Canvas(result);
// Draw bitmap C to canvas 'under' view B
canvas.drawBitmap(bitmapC, 0, iViewBHeight, null);
// Draw view B to canvas
viewB.setDrawingCacheEnabled(true);
viewB.buildDrawingCache(true);
canvas.drawBitmap(Bitmap.createBitmap(viewB.getDrawingCache()), 0, 0, null);
viewB.setDrawingCacheEnabled(false);
// Desired bitmap is at 'result'
结果是位图C画好了,但是视图B太大,扩展了位图。 我没有尝试添加视图 D..
谁能帮帮我?也许有更好的方法来实现我的目标? 谢谢!
我认为最简单的方法是截取 Activity
的全部内容,然后截取 A View
。 Canvas#drawBitmap(Bitmap bmp, Rect src, Rect dest, Paint pnt)
重载很容易做到这一点。 Rect src
描述了您正在复制的源 Bitmap
部分,而 dest
是目标 Bitmap
中源将被绘制的部分。(注意: Rect
尺寸不必相同。)
我相信如果我没听错的话,下面的方法应该可以满足您的需求。
private Bitmap capture()
{
View actContent = findViewById(android.R.id.content);
Bitmap result = Bitmap.createBitmap(actContent.getWidth(),
actContent.getHeight() - viewA.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
actContent.setDrawingCacheEnabled(true);
Rect src = new Rect(0, viewA.getHeight(), actContent.getWidth(), actContent.getHeight());
Rect dest = new Rect(0, 0, result.getWidth(), result.getHeight());
canvas.drawBitmap(actContent.getDrawingCache(), src, dest, null);
actContent.setDrawingCacheEnabled(false);
return result;
}