0

我一直在研究创建基于 ViewGroup 的自定义布局,并且我得到(我认为)布局所基于的概念。无论如何,其中一些。

似乎基本思想是

  • 首先询问您所有孩子的观点,他们想要多大 - 在 onMeasure()
  • 基于此计算布局
  • 根据所需的大小定位它们 - 在 onLayout()

我想这有点像网页布局。

但是,我根本不想这样做。基于可用的屏幕空间(x/y px),我有一大堆子视图(各种文本、按钮、自由格式图形),我需要定义它们的尺寸、设置文本大小,然后定位。即我对他们想要多大并不感兴趣,我想告诉他们他们将有多大以及他们将在哪里。

有(曾经)一个 AbsoluteLayout 做类似的事情,但它被贬值了。

由于布局完全与孩子(工作的完全固定数量)和屏幕尺寸相关,我建议:

  • 创建我自己的自定义布局子类 ViewGroup
  • 早期的某个地方 - 可能在它的 onCreate() 中?- 创建所有的孩子(我确切地知道需要什么)
  • 在 onMeasure() 中忽略孩子们想要的一切,尽管我怀疑我必须调用 measureChild() 来避免异常,方法是确保在任何地方调用 setMeasuredDimension(),并根据传入的尺寸计算布局(大小、位置)宽度/高度测量规格
  • 在 onLayout() 中,只需告诉所有孩子它会如何(“你在这里,这么大”)
  • 因为我对孩子们想要的尺寸不感兴趣,所以只需吸收任何 layoutRequest() 回调并且什么都不做

然而,这在概念上似乎与 Android 认为应该完成布局的方式背道而驰——但这正是我所需要的。

所以我的问题是——这是一个可行的方案吗?

4

3 回答 3

1

您可以获取源代码AbsoluteLayout并根据您的需要进行调整。如果AbsoluteLayout被弃用,那将是有原因的,如果该原因不适用于您,您可以自由地做任何您喜欢的事情。

于 2012-06-27T05:29:24.420 回答
0

是的,虽然 AbsoluteLayout 已被弃用,但仍可用于 ICS。

不过,您可能需要重新考虑您的 UI 设计——它已被弃用是有原因的。

于 2012-06-27T05:33:09.050 回答
0

如果你想准确地告诉孩子们应该是什么尺寸,当你调用 onMeasure 时,你会通过 MeasureSpec 模式准确地传递尺寸。他们应该遵守这一点,你不应该做任何变通办法来忽略他们请求的大小。

请参阅View.MeasureSpec编码。传递给 onMeasure 的 (int,int) 应该是 measureSpec 编码的。

于 2012-06-27T05:35:06.863 回答