在 Android 上的动态壁纸中使用布局资源

2023-12-20

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

将单个视图转换为位图效果很好。即这效果很好:

// 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 会导致问题。你only获取 LinearLayout 本身,但没有它的子级。例如,如果我将 LinearLayout 设置为白色背景,我会得到一个渲染良好的白色框,但所有 TextView 子项都不在位图中。我也尝试使用 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);

有谁知道您是否需要执行任何特殊操作才能将子项正确渲染到我的位图?即,我是否需要以某种方式做一些特殊的事情来使布局渲染其余的子项?我应该编写一个函数来递归地对所有孩子做某事吗?

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

Edit:在深入研究布局的状态时,看起来布局似乎没有沿着视图树向下推进(即,当我调用layout()时,LinearLayout会计算其布局,但子级的大小为空(0x0))。根据 Romain Guy 2008 年的帖子安卓开发者帖子 http://groups.google.com/group/android-developers/browse_thread/thread/8318671d0313024/e32c50aff962e0a2。您必须等待布局传递或自己强制布局。问题是如何等待来自壁纸引擎的未附加到根视图组的 LinearLayout 的布局传递?如果布局要求您设置左、上、右、下,而我不知道这些应该是什么,我该如何手动布局每个子元素。

我尝试对孩子们调用forceLayout,但似乎也没有帮助。我不确定布局框架在幕后如何工作(除了它进行两遍布局之外)。有没有办法手动让它进行布局传递,即现在?因为它不是一个 Activity,所以我认为很多正常的背景事情并没有按照我想要的方式发生。


动态壁纸经过专门设计,不使用标准 UI 小部件。然而无论如何都可以使用它们。您必须通过首先在视图上调用measure(),然后调用layout()来强制自己传递布局。您可以在我的中找到更多信息.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 上的动态壁纸中使用布局资源 的相关文章

随机推荐