在Android中,什么布局更快1.LinearLayout或2中的FrameLayouts.一个大亲戚布局



我正在考虑一个视图的两种不同布局安排(它将是RecyclerView中的一行)。它们是不同的,但它们都会起作用,要么作为

  1. 一个容器垂直LinearLayout,包含FrameLayout行,例如LinearLayout->FrameLayout->Content
  2. 一个包含所有其他视图的大型RelativeLayout(没有FrameLayouts,但所有TextViews、按钮等),例如RelativeLLayout->Content

现在我想知道:就布局性能而言,哪一个更可取?

据我所知,RelativeLayout必须测量两次,因此速度相当慢,而FrameLayout速度很快,LinearLayout在布局性能方面还可以。在一种情况下,我只会有一个较慢的容器(RelativeLayout->Content),而在另一种情况中,我会有两个较快的容器(LinearLayout->FrameLayouts->Content)。

简短回答(TLDR):

如果你真的知道自己在做什么,RelativeLayout可以更快。如果你不这样做,它们可能会慢得多。

答案很长:

手动嵌套布局(如LinearLayout中的FrameLayout)与在RelativeLayout中使用相对定位相比,无论哪种方式都有利弊。

成本在于计算动态大小,如"wrap_content",这些大小必须根据孩子的需求进行扩展或根据父母的要求进行限制。这会导致阶乘计算问题,该问题会随着深度的增加而增加。

通过使用嵌套视图手动定位可以提高级别。水位越浅越好,但仍然有效。因此,从字面上讲,工作量是你的水平深度的因子,如上所述。例如:A嵌套在根下。B嵌套在A之下。C嵌套在B之下。A会影响根的宽度。B影响A,A影响Root。C影响B,而B影响A,而A影响Root。

通过使一个视图自身相对于另一个视图定位的相对定位,在动态大小计算方面与嵌套视图相同,因为必须在计算每个关系时考虑另一个关系。例如:

A是Root的左边。B是A的左边。C是B的左边。当A、B、C都生活在根下时,动态测量是这样发生的:A会影响根的宽度。B影响A,A影响Root。C影响B,而B影响A,而A影响Root。

换句话说,您将进行相同的阶乘计算。

因此,唯一真正的区别是RelativeLayout以更复杂的XML为代价,为您提供了对相对位置的更精细控制。

另一方面,通过仔细使用基于设备属性提前计算的@dimens,可以避免动态计算,并且如果使用得当,在需要复杂定位时,RelativeLayout可以比任何其他布局都更具性能。

这取决于上下文,没有简单的方法来回答这个问题。已经有一些现有的线程进行了类似的讨论,人们认为性能的提高可以忽略不计。

RecyclerView允许您重用现有的ViewHolders。一次创建数量有限的ViewHolders("RecyclerView池"),并考虑到不同的视图类型计数。

假设您没有破坏ViewHolder模式,例如在绑定方法中每次都膨胀视图,您就不太可能感觉到RelativeLayout和LinearLayout根布局之间的差异。

但是,如果您使用某种具有动态大小属性的对象(例如,高度设置为wrap_content的ImageView,并将不同的位图加载到其中),则您的布局很可能会在每次调用onBindViewHolder()时无效并重新计算。

因此,我的假设是,合理使用RelativeLayout不会给您带来任何性能问题。

最新更新