ConstraintLayout和RelativeLayout之间的差异

我很困惑ConstraintLayout和RelativeLayout之间的区别。 有人能告诉我他们之间的确切区别吗?

ConstraintLayout意图是通过对每个视图应用一些规则来优化和压扁布局的视图层次结构,以避免嵌套。

规则会提醒您使用RelativeLayout ,例如将其他视图的左侧设置为左侧。

 app:layout_constraintBottom_toBottomOf="@+id/view1" 

RelativeLayout不同的是, ConstraintLayout提供了bias值,用于根据相对于手柄的0%和100%水平和垂直偏移(用圆圈标记)来定位视图。 这些百分比(和分数)提供了不同屏幕密度和大小的视图的无缝定位。

 app:layout_constraintHorizontal_bias="0.33" <!-- from 0.0 to 1.0 --> app:layout_constraintVertical_bias="0.53" <!-- from 0.0 to 1.0 --> 

基准手柄 (带圆angular的长圆pipe,在圆形手柄下方)用于将视图的内容与另一个视图引用alignment。

方形手柄 (在视图的每个angular落)用于调整dps视图的大小。

在这里输入图像描述

这完全是基于观点和我对ConstraintLayout印象

通过@davidpbr ConstraintLayout报告性能

我做了两个类似的7子布局,每个都有一个父级ConstraintLayout和RelativeLayout。 基于Android Studio方法追踪工具,ConstraintLayout在onMeasure上花费更多时间,并在onFinishInflate中执行额外的工作。

使用的库(support-v4,appcompat-v7,…):

'com.android.support.constraint:约束的布局:1.0.0-α1'

Devices / Android版本转载于:Samsung Galaxy S6(SM-G920A,对不起,没有Nexus atm)。 Android 5.0.2

快速方法跟踪比较:

1

示例Github回购: https : //github.com/OnlyInAmerica/ConstraintLayoutPerf

一个很大的区别就是即使视图消失,ConstraintLayout也会受到约束。 所以如果你有一个链条,它不会打破布局,你想让视图在中间消失。

以下是差异/优势:

1)约束布局具有相对布局和线性布局的双重function:设置视图的相对位置(如相对布局),并为dynamicUI设置权重(仅在线性布局中可能)。

2)一个非常强大的用途是通过形成一个链条的元素分组。 通过这种方式,我们可以形成一组视图,作为一个整体可以按照需要的方式放置,而不用为了形成另一组视图而添加另一层次的层次结构。

3)除了权重,我们还可以应用水平和垂直偏差,这只是中心位移的百分比。 (0.5的偏差意味着居中alignment,任何小于或者大于的值意味着在相应的方向上相应的移动)。

4)另一个非常重要的特性是它尊重并提供了处理GONE视图的function,以便在某些视图通过Java代码设置为GONE时布局不会中断。 更多可以在这里find: https : //developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

5)通过使用蓝色打印和可视化编辑器工具提供了自动约束应用的function,这使得易于devise页面。

所有这些function导致了视图层级的扁平化,从而提高了性能,并且还有助于制作响应性和dynamic的UI,其可以更容易地适应不同的屏幕尺寸和密度。

以下是快速学习的最佳地点: https : //codelabs.developers.google.com/codelabs/constraint-layout/#0

真正的问题是,是否有任何理由使用约束布局以外的任何布局? 我相信答案可能不是。

对于那些坚持以新手程序员为目标的人来说,他们应该提供一些原因,使他们不如别的布局。

约束布局在各方面都更好(他们花费的APK大小为150k)。 它们更快,更容易,更灵活,对变化的反应更好,当项目消失时,它们会解决问题,更好地适应截然不同的屏幕types,并且不会使用一堆嵌套的循环抽出一切的树结构。 你可以把任何东西放在任何地方。

他们在2016年年中有些扭曲,那里的视觉布局编辑器还不够好,但是他们要指出,如果你有一个布局,你可能要认真考虑使用约束布局,甚至当它做一个相同的事情作为一个RelativeLayout,甚至一个简单的LinearLayout。 FrameLayouts显然仍然有其目的。 但是,在这一点上,我看不到任何其他的东西。 如果他们从此开始,他们不会再添加任何东西。

我注意到的唯一区别是通过拖放设置的相对布局中的事物自动具有相对于推断的其他元素的尺寸,所以当你运行应用程序时,你所看到的就是你所得到的。 但是,即使在devise视图中拖放元素,在约束布局中,当您运行应用程序时,事情可能会转移。 通过手动设置约束可以很容易地解决这个问题,或者更有风险的做法是右键单击组件树中的元素,select约束布局子菜单,然后单击“推断约束”。 希望这可以帮助

正式的, ConstraintLayout 要快得多

ConstraintLayout类提供了与RelativeLayout类似的function,但成本显着降低。

除了@ dhaval-jivani回答。

我已经将项目github项目更新到最新版本的约束布局v.1.1.0-beta3

我已经测量并比较了onCreate方法的时间和onCreate的开始时间和CPU监视器中可见的最后一个preformDraw方法的执行结束之间的时间。 所有的testing都使用android 6.0.1在Samsung S5 mini上完成。结果如下:

新的开始(应用程序启动后第一个屏幕打开)

相对布局

OnCreate:123ms

最后的预制图绘制时间 – 创build时间:311.3ms

约束布局

OnCreate:120.3ms

最后预成型绘图时间 – 创build时间:310毫秒

除此之外,我已经从这篇文章中检查了性能testing, 这里是代码 ,发现在循环计数小于100的情况下,约束布局变体在执行充气,测量和布局时比在相对布局的变体更快。 而在旧的Android设备上,比如使用Android 4.3的三星S3,差距更大。

作为一个结论,我同意这篇文章的评论:

是否值得重构旧视图从RelativeLayout或LinearLayout开关?

一如既往:这取决于🙂

我不会重构任何东西,除非您的当前布局层次结构出现性能问题,或者您要对布局进行重大更改。 尽pipe最近我还没有测量过,但是在最近的发行版中还没有发现任何性能问题。 所以我认为你应该安全地使用它。 但是 – 正如我所说的 – 不是为了迁徙而迁徙。 只有这样做,如果有需要,并从中受益。 不过,对于新的布局,我几乎总是使用ConstraintLayout。 和以前相比,它好多了。