我正在尝试完全在屏幕外创建和渲染视图。首先,我尝试过(来自http://arpitonline.com/2012/07/17/capturing-bitmaps-of-views-in-android/):
Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.draw(c);
return result;
它只呈现了我的视图的背景颜色。这是正确的大小和正确的背景颜色,但内容完全是空的。然后我偶然发现了这个:
view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
view.destroyDrawingCache();
return result;
但同样,它产生了相同的结果:正确的大小和背景颜色,内容为空。我的视图中有很多视图,我在它们上设置了许多属性,没有空指针等,一切都设置正确。但他们只是没有被画出来。为什么会发生这种情况?
更新:正如 psking 所建议的,我已经将我的绘图逻辑移到了,View#post
但它仍然是相同的(尽管触发完成需要更长的时间,这可能是视图实际做某事的线索)。两种方法都试过:
(完成是我的功能,需要一个位图)
final Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.post(new Runnable() {
@Override
public void run() {
view.draw(c);
completion.call(result);
}
});
和
view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.post(new Runnable() {
@Override
public void run() {
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
view.destroyDrawingCache();
completion.call(result);
}
});
但还是一样。