当您在Android 2.2或更高版本中创建LiveWallpaper时,您将得到一个画布(或任何3D等价物)来绘制。我想使用内置的Android UI工具来绘制一些元素,而不是使用canvas命令从头开始构建所有内容,或者加载预渲染的UI位图。在Android上的LiveWallpaper中使用布局资源
转换单一视图为位图工作正常。即这工作很好:
// 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子项位于Bitmap中。我也尝试使用DrawingCache获得类似的结果。
我正在使用的代码是唯一的变化是一个额外的绘制命令立方体的例子。 LinearLayout可以很好地作为吐司或常规视图(即一切都很好地显示出来),在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中得到它的布局时,我打电话布局(计算机),但孩子们有一个空(0x0)大小)。根据2008年的罗曼盖伊的职位android developer post。您必须等待布局通过或自己强制布局。问题是如何等待来自墙纸引擎的布局传递给未连接到根视图组的LinearLayout?如果布局要求您设置左侧,顶部,右侧和底部,我不知道这些应该是什么,那么如何手动布局每个子元素。
我已经打过电话forceLayout的孩子,但它似乎并没有帮助的。我不确定布局框架是如何在幕后工作的(除此之外它还实现了两遍布局)。有没有办法手动让它做布局传递,即现在?由于这不是一个活动,我不认为很多正常的背景资料都是按照我喜欢的方式进行的。
您是否实施了建议的解决方案?我正在评估相同的方法,但希望从您的经验中学习 – dparnas 2012-01-12 14:40:24