从自定义视图中保存位图,该视图通过onDraw方法进行动画处理

时间:2012-03-28 19:23:33

标签: android bitmap

所以我有一个动画,它是通过在自定义视图的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线程上使用它。

如果可以,请帮助。

1 个答案:

答案 0 :(得分:1)

您不应该从UI线程外部调用getDrawingCache()。这就是为什么你得到的位图有部分更新的扫描线。直接从saveView()致电onDraw()。在克隆缓存的位图之后,只有文件操作可以在不同的线程上运行。

注意:您可以致电setDrawingCacheEnabled(true)?这样您就不必致电buildDrawingCache()destroyDrawingCache()。此外,如果您的设备已启用硬件加速功能,则必须拨打setLayerType(LAYER_TYPE_SOFTWARE, null)

另一个解决方案是通过在包含空白位图的新画布上调用View.draw(android.graphics.Canvas)来获取位图。