将单个视图转换为位图可以正常工作。例如,以下内容非常有效:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap( 200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
但是,转换带有子元素的LinearLayout会引起问题。您只会得到LinearLayout本身,而没有它的任何子元素。例如,如果我将LinearLayout设置为白色背景,我会得到一个漂亮渲染的白色框,但是其中的TextView子元素都不在位图中。我还尝试使用DrawingCache,结果类似。
我正在使用的代码是立方体示例,唯一的更改是额外的绘制命令。LinearLayout作为toast或常规视图正常工作(即所有内容都很好地显示出来),但在LiveWallpaper上,我只能看到LinearLayout的背景。
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap( 400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
有没有人知道如何让我的子项正确地渲染到位图中?也就是说,我是否需要采取某些特殊措施来使布局呈现其余的子项?我是否应该编写一个递归函数来对所有子级执行某些操作?
我可以自己合成所有内容,但由于显示区域相当静态(即我只需绘制一次,并保存位图的副本以在背景上绘制),这似乎更容易实现且仍然非常高效。
编辑: 在进一步研究布局状态时,看起来布局未沿着视图树向下进行(即LinearLayout在调用layout()时计算其布局,但子项的大小为null(0x0))。 根据Romain Guy在2008年的文章中的说法android developer post,您必须等待布局通行证或强制自己布局。问题在于,我如何在不连接到根视图组的LinearLayout上等待布局通行证?如果布局需要在我不知道这些值应该是什么的情况下设置左、上、右、下,我如何手动布置每个子元素。
我尝试调用子项上的forceLayout,但似乎也没有帮助。我不确定布局框架在幕后是如何工作的(除了它执行两个传递的布局)。是否有一种方法可以手动使其进行布局通行证,即立即?由于它不是Activity,我认为许多正常的后台操作并不完全按照我想要的方式进行。