在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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...