在Android上的LiveWallpaper中使用布局资源

前端之家收集整理的这篇文章主要介绍了在Android上的LiveWallpaper中使用布局资源前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

当您在Android 2.2中创建LiveWallpaper时,您将获得一个画布(或任何3D等效物).我想使用内置的Android UI工具绘制一些元素,而不是使用canvas命令从头开始构建所有元素或加载预渲染的UI位图.

将单个视图转换为位图工作正常.即这很有用:

// For example this works:
TextView view = new TextView(ctx);
view.layout(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,mPaint);

但是,使用子项转换LinearLayout会导致问题.你只能得到LinearLayout本身,而不是它的孩子.例如,如果我将LinearLayout设置为具有白色背景,则会获得一个很好地渲染的白色框,但是Bitmap中没有任何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,400,200);

Bitmap b = Bitmap.createBitmap( 400,Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b,10,mPaint);

有没有人知道你是否需要做一些特别的事情来让孩子们正确地渲染到我的位图?即,我是否需要以某种方式做一些特别的事情来使布局渲染其余的孩子?我应该写一个函数来递归地对所有孩子做些什么吗?

我可以自己合成所有东西,但是,因为显示是相当静态的(即我画了一次并保留位图的副本以在背景上绘制)这对我来说似乎更容易并且仍然非常有效.

编辑:
在挖掘布局状态的同时,看起来好像布局没有沿着视图树向下移动(即,当我调用layout()时,LinearLayout得到它的布局,但子窗口的大小为null(0x0)).根据Romain Guy在2008年android developer post的帖子.您必须等待布局传递或自己强制布局.问题是我如何等待壁纸引擎的布局传递给没有连接到根视图组的LinearLayout?如果布局要求您在我不知道这些应该是什么时设置左,上,右,下,我该如何手动布局每个子元素.

我试过在孩子身上调用forceLayout,但似乎也没有帮助.我不确定布局框架如何在幕后工作(除了它做了两遍布局).有没有办法手动让它做布局通过,即现在?由于它不是一个活动我不认为很多正常的背景材料正在发生我想要的方式.

最佳答案
动态壁纸是专为不使用标准UI小部件而设计的.但无论如何都可以使用它们.您必须首先在View上调用measure(),然后在layout()上强制执行布局传递.您可以在我的presentation中找到更多信息.

猜你在找的Android相关文章