我有一个 ImageView
和两个 TextViews
的简单组合。我想让 TextViews
与 ImageView
重叠,然后将组合保存为一个整体(例如 PNG)。
我知道我可以使用 FrameLayout
将 TextViews
叠加在 ImageView
上,我已经在这样做了。现在我想知道的是,如何将其导出为图像?
我阅读了有关使用 Canvas 的各种帖子。有没有一种方法可以将 FrameLayout
导出为 PNG 图像,或者我是否需要创建一个 Canvas ,添加 ImageView
和 TextViews
,并将 Canvas 本身导出为 PNG?
提前谢谢你。
最佳答案
可以轻松完成吗?,是的
怎么做?
好吧,前几天我碰巧为此做了一个函数,它真的很简单(确保你有写入外部设备的权限)。您所要做的就是指定要将哪个 View (它也将包括所有 subview )“绘制”到 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
方法上执行此代码,因为您可能会在绘制 View 之前尝试获取 View 的宽度和高度因此会导致错误,因为位图的尺寸不能为 0。
它是按原样还是创建时捕获 View ?
一开始我不太确定,但经过一些测试后,似乎所见即所得,所以如果你有旋转或与发射时的原始配置不同的东西,它会在捕捉中反射(reflect)出来。这可能是也可能不是您所追求的,但这就是它所提供的。这是捕获的 LinearLayout
示例(没有屏幕截图或裁剪,只是直接从设备获取)。
关于java - 将 ViewGroup 捕获到图像文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644526/