我有一个ImageView
和两个TextViews
的简单组合。我想TextViews
重叠ImageView
,然后将整个组合保存(例如PNG)。
我知道我可以使用TextViews
将ImageView
分层到FrameLayout
上,我已经在做了。现在我想知道的是,如何将其导出到图像?
我阅读了有关使用Canvas的各种帖子。有没有办法将FrameLayout
导出为PNG图像,或者我是否需要创建画布,添加ImageView
和TextViews
,并将画布本身导出为PNG?
提前谢谢。
答案 0 :(得分:6)
可以轻松完成吗?,是
如何吗
好吧,前几天我碰巧已经为此做了一个功能,而且非常简单(确保你有写入外部设备的权限)。你所要做的就是指定你想要“绘制”到Bitmap
的视图(它也将包括所有的子视图),之后你可以像你说的那样将它保存为文件,或者在你的某个地方使用它应用
public void captureView(int viewId,String filename){
//Find the view we are after
View view = (View) findViewById(viewId);
//Create a Bitmap with the same dimensions
Bitmap image = Bitmap.createBitmap(view.getWidth(),
view.getHeight(),
Bitmap.Config.RGB_565);
//Draw the view inside the Bitmap
view.draw(new Canvas(image));
//Store to sdcard
try {
String path = Environment.getExternalStorageDirectory().toString();
File myFile = new File(path,filename);
FileOutputStream out = new FileOutputStream(myFile);
image.compress(Bitmap.CompressFormat.PNG, 90, out); //Output
} catch (Exception e) {
e.printStackTrace();
}
}
注意避免尝试在onCreate
方法上执行此代码,因为您可能在绘制视图之前尝试获取视图的宽度和高度,因此导致错误,因为位图的尺寸不为0。
是否按原样或创建视图捕获视图?
我一开始并不是很确定,但经过一些测试后,看起来你所看到的就是你所得到的,所以如果你在发射时有一些旋转或不同于原始配置的东西,它会在捕捉中反映出来。这可能是也可能不是你所追求的,但它是它所提供的。以下是捕获LinearLayout
的示例(没有屏幕截图或裁剪,只是直接来自设备)。