Don*_*tch 30 android android-layout android-linearlayout
一些常用的android布局,例如RelativeLayout和LinearLayout(当权重非零时)有onMeasure()实现,它们测量它们的子项两次,导致嵌套时的指数运行时间.这可以通过从叶子视图的onMeasure()中发出日志条目来轻松验证...它被称为2 ^深度时间.
有人可以给出明确和具体的描述,为什么这是?最重要的是,这种指数行为是由于整体合同的重要部分,还是只是一个可能被优化的实施细节?如果认为这是不可避免的,请举一个需要它的例子.
这样的例子将极大地帮助我和其他抱怨"保持你的布局浅"的任务是繁重的,并且想知道这是否仅仅是由核心库中尚未优化的算法驱动,或者是否确实存在阻止修复的根本困难.
也许最小的例子包括另一个LinearLayout内的LinearLayout内的Button(其中match_parent和weight = 1,触发完整的指数行为),以及一些额外的参数或情况,清楚地表明对Button的所有四个调用. onMeasure()确实有意义且必要.
我的第一个猜测是,实际上只需要两次线性时间遍历 - 第一次遍历以收集每个人的首选大小,第二次遍历来分配松弛和/或收缩.像Tex和Swing这样的世界上的其他布局引擎似乎能够经常处理具有大量对齐约束和延伸的非常深层次的层次结构,而没有任何指数爆炸,我想这就是它们的工作方式.
请注意,我不希望答案解释如何 发生指数性爆炸 - 我理解这一点,并且已经有几个帖子已经被问及并回答:
我的问题是递归双重测量是否从根本上是必要的/合理的,如果是,我想要一个明确的解释/示例来说明原因.
编辑2013/8/22:我想也许我的问题仍未解决.这次我会试着更大胆地澄清和解释我的动机.
布局不是一个指数级的难题,正如Tex和Swing等世界上有效的布局引擎所证明的那样.
那么,LinearLayout发生了什么,android开发者社区应该如何进行响应呢?我不是要本着责备的精神,而是要理解并决定如何最好地前进.
我可以想到4种可能性:
(4)对我个人来说不是一个严肃的选择.此外,我觉得在这一点上改变LinearLayout的行为是不切实际的,所以我不相信(2)也是一个严肃的选择.
离开(1)和(3).我有能力并愿意亲自去做其中任何一个,但哪一个?显然(1)如果可能的话,这是可取的 - 所以,有可能吗?这似乎是需要回答的关键阻塞问题,以确定如何向前发展.
我花了一些时间在核心代码和文档中并且它没有变得清晰,所以这就是为什么我在这里问这个问题.
在测量儿童两次方面,我的理解是这就是LinearLayouts所发生的情况,特别是涉及权重时.我发现的最好的解释来自RomainGuy在他的一个演讲中.
他有一个关于此的幻灯片,并在17:45简要地说出来.尽管如此,请随意回放以获得一些背景信息.你可以在这里找到我引用的视频:Devoxx'10 - 潜入Android
基本上他所说的是,在第一遍时,他们根据LinearLayout的方向计算总宽度或高度,添加子项的权重,并找出剩余多少空间,然后在第二次传递时使用该信息能够正确地将所有剩余空间分配给所有孩子.很简单.
我还想指出,虽然是的,虽然浅层布局层次结构的性能影响较小,但如果只添加1或2个额外层,您可能不会看到很大的性能影响为用户.一旦布局,它就完成了.即使在ListView中,如果你正确使用给定的"convertView",并设置ViewHolder,你将获得良好的性能.
我鼓励您使用DDMS并对Google的某些应用进行布局转储.它们非常复杂,而且往往非常复杂,但它们仍然可以获得良好的性能.不要对你的布局愚蠢,但如果它节省你的时间,添加额外的布局不是世界末日.
| 归档时间: |
|
| 查看次数: |
1500 次 |
| 最近记录: |