所以我有一个动画,它是通过在自定义视图的onDraw()方法中绘制一堆位图来创建的。有一个更新线程调用自定义视图中的方法,该方法更改要由onDraw()方法绘制的位图的位置。我想要做的是保存每次更新线程完成时创建的位图,以便我可以从我保存的位图创建一个gif。
我发现下面的代码将png从存储在内存中的位图保存到SD卡,并且可以使用存储的位图,但是我遇到了getDrawingCache()的问题:
public void saveView(){
if(counter < 200){
try {
counter++;
System.out.println("Counter : " + counter);
File file = new File(path, "star"+counter+".png");
file.delete();
OutputStream fOut = new FileOutputStream(file);
buildDrawingCache();
getDrawingCache().compress(Bitmap.CompressFormat.PNG, 100, fOut);
destroyDrawingCache();
fOut.flush();
fOut.close();
MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样做基本上可以做两件事:
1)大约需要50张图像并将其保存到SD卡中。 @大约50它导致堆变大(我猜destroyDrawingCache()无法实际完成,因为这是在一个单独的线程)
2)在拍摄的照片中,您可以看到缓冲区更新中的扫描线,因为我从更新的缓冲区中取出。
似乎getDrawingCache也调用了onDraw(),这就是为什么我不能在onDraw本身的UI线程上使用它。
如果可以,请帮助。
答案 0 :(得分:1)
您不应该从UI线程外部调用getDrawingCache()
。这就是为什么你得到的位图有部分更新的扫描线。直接从saveView()
致电onDraw()
。在克隆缓存的位图之后,只有文件操作可以在不同的线程上运行。
注意:您可以致电setDrawingCacheEnabled(true)
?这样您就不必致电buildDrawingCache()
和destroyDrawingCache()
。此外,如果您的设备已启用硬件加速功能,则必须拨打setLayerType(LAYER_TYPE_SOFTWARE, null)
。
另一个解决方案是通过在包含空白位图的新画布上调用View.draw(android.graphics.Canvas)
来获取位图。