gpt4 book ai didi

android - 通过 onDraw 方法从具有动画的自定义 View 中保存位图

转载 作者:太空狗 更新时间:2023-10-29 14:28:04 27 4
gpt4 key购买 nike

所以我有一个动画,它是通过在自定义 View 的 onDraw() 方法中绘制一堆位图来创建的。有一个更新线程调用自定义 View 中的方法,该方法更改要由 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 线程上使用它。

如果可以,请帮忙。

最佳答案

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

注意:您可以调用setDrawingCacheEnabled(true) ?这样您就不必调用 buildDrawingCache()destroyDrawingCache()。此外,如果您的设备打开了硬件加速,则必须调用 setLayerType(LAYER_TYPE_SOFTWARE, null)

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

关于android - 通过 onDraw 方法从具有动画的自定义 View 中保存位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9914310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com