我不是Android专家,但我知道有关正确使用LinearLayout和RelativeLayout的讨论,保持视图层次结构尽可能小,避免不必要的onMeasure()传递等。
让我们想象一下,我有两个想要完全独立定位的ImageView,第一个位于父级中心,第二个位于父级左下角。 (请注意,这是一个非常复杂的现实生活要求的例子)。
解决这个问题的显而易见的方法是使用RelativeLayout ...
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/first_image" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="true"
android:layout_alignBottom="true"
android:src="@drawable/second_image" />
</RelativeLayout>
然而有些事情告诉我,在这种情况下,RelativeLayout不合适,因为我不想将孩子相对于彼此组织起来。我想做的就是根据父级定位子项,我想知道使用RelativeLayout是否会导致一些我不需要的不必要的布局计算。
我想知道是否还有其他ViewGroup类型会表现更好?完全有可能用FrameLayout实现我想要的东西,但是我不知道这是否更具性能或者我是否滥用了FrameLayout的意图等等......
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/first_image" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:src="@drawable/second_image" />
</FrameLayout>
也许还有另一种我不知道的布局类型?
答案 0 :(得分:3)
根据您提供的信息,FrameLayout
很有可能表现得更好。你可能已经学会了观察(Adam Powell quote in Google I/O 2013 conference),
[...] RelativeLayouts将多次测量子视图,以解决您给出的一些限制。因此,通用具有成本[...]
从我阅读和理解的内容来看,这并不能保证,这取决于你给出的限制。
这取决于。
我们都阅读Romain Guy blog post : Android Layout Tricks #1,said that most people misinterpret post他post并开始在任何地方使用RelativeLayout
。
此{{3}},如果您还没有阅读,请讨论如何使用RelativeLayout
而不是LinearLayout
删除一个层次结构级别,从而节省列表中的加载时间。
基本上,这意味着如果你不需要它们,就像你自己描述的那样
[...]我有两个想要完全独立定位的ImageView [...]我不想把孩子们相对于彼此组织起来
因为这个原因你不应该使用它们。
例如,在我们的一个应用程序中,我们在运行Gingerbread的设备上遇到严重的性能问题 - 我们希望支持它们。
我们最复杂的布局涉及一个垂直ScrollView
,附加到当前活动,其中我们有几个容器和一个HorizontalScrollView
,它们显示复杂{{1}中包含的图像和信息}。
我们开始将LinearLayout
替换为LinearLayout
。结果:没有明显的改善 - 相当于或者更糟。
由于该布局相当复杂,因此在彼此中添加更多RelativeLayout
只会增加为单次绘制所做的RelativeLayout
次调用。
即使是一个小型循环onMeasure()
现在也在用多个度量调用发送垃圾邮件,因为它位于其中一个嵌入式ProgressBar
中,触发了整个视图的重新计算。