我对ConstraintLayout和RelativeLayout之间的区别感到困惑。有人能告诉我它们之间的确切区别吗?


当前回答

由@davidpbr ConstraintLayout性能报告

我做了两个类似的7个子布局,每个都有一个父ConstraintLayout和RelativeLayout。 基于Android Studio方法跟踪工具,它似乎ConstraintLayout花更多的时间在onMeasure和执行额外的工作在onfinishinflation。

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

com.android.support.constraint: constraint-layout: 1.0.0-alpha1

设备/Android版本转载于: 三星Galaxy S6 (SM-G920A;对不起,没有Nexus atm)。Android 5.0.2

快速方法跟踪比较:

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

其他回答

以下是它们的区别/优点:

Constraint Layout has dual power of both Relative Layout as well as Linear layout: Set relative positions of views ( like Relative layout ) and also set weights for dynamic UI (which was only possible in Linear Layout). A very powerful use is grouping of elements by forming a chain. This way we can form a group of views which as a whole can be placed in a desired way without adding another layer of hierarchy just to form another group of views. In addition to weights, we can apply horizontal and vertical bias which is nothing but the percentage of displacement from the centre. ( bias of 0.5 means centrally aligned. Any value less or more means corresponding movement in the respective direction ) . Another very important feature is that it respects and provides the functionality to handle the GONE views so that layouts do not break if some view is set to GONE through java code. More can be found here: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior Provides power of automatic constraint applying by the use of Blue print and Visual Editor tool which makes it easy to design a page.

所有这些特性都使视图层次结构变得平坦,从而提高了性能,还有助于制作响应性和动态的UI,从而更容易适应不同的屏幕尺寸和密度。

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

相对布局和约束布局的等效属性

(1)相对布局:

android:layout_centerInParent="true"    

(1)约束布局等效:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

(2)相对布局:

android:layout_centerHorizontal="true"

(2)约束布局等效:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"

(3)相对布局:

android:layout_centerVertical="true"    

(3)约束布局等效:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"

(4)相对布局:

android:layout_alignParentLeft="true"   

(4)约束布局等效:

app:layout_constraintLeft_toLeftOf="parent"

(5)相对布局:

android:layout_alignParentStart="true"

(5)约束布局等效:

app:layout_constraintStart_toStartOf="parent"

(6)相对布局:

android:layout_alignParentRight="true"

(6)约束布局等效:

app:layout_constraintRight_toRightOf="parent"

(7)相对布局:

android:layout_alignParentEnd="true"    

(7)约束布局等效:

app:layout_constraintEnd_toEndOf="parent"

(8)相对布局:

android:layout_alignParentTop="true"

(8)约束布局等效:

app:layout_constraintTop_toTopOf="parent"

(9)相对布局:

android:layout_alignParentBottom="true" 

(9)约束布局等效:

app:layout_constraintBottom_toBottomOf="parent"

(10)相对布局:

android:layout_alignStart="@id/view"

(10)约束布局等效:

app:layout_constraintStart_toStartOf="@id/view"

(11)相对布局:

android:layout_alignLeft="@id/view" 

(11)约束布局等效:

app:layout_constraintLeft_toLeftOf="@id/view"

(12)相对布局:

android:layout_alignEnd="@id/view"  

(12)约束布局等效:

app:layout_constraintEnd_toEndOf="@id/view"

(13)相对布局:

android:layout_alignRight="@id/view"

(13)约束布局等效:

app:layout_constraintRight_toRightOf="@id/view"

(14)相对布局:

android:layout_alignTop="@id/view"  

(14)约束布局等效:

app:layout_constraintTop_toTopOf="@id/view"

(15)相对布局:

android:layout_alignBaseline="@id/view" 

(15)约束布局等效:

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16)相对布局:

android:layout_alignBottom="@id/view"

(16)约束布局等效:

app:layout_constraintBottom_toBottomOf="@id/view"

(17)相对布局:

android:layout_toStartOf="@id/view"

(17)约束布局等效:

app:layout_constraintEnd_toStartOf="@id/view"

(18)相对布局:

android:layout_toLeftOf="@id/view"  

(18)约束布局等效:

app:layout_constraintRight_toLeftOf="@id/view"

(19)相对布局:

android:layout_toEndOf="@id/view"

(19)约束布局等效:

app:layout_constraintStart_toEndOf="@id/view"

(20)相对布局:

android:layout_toRightOf="@id/view"

(20)约束布局等效:

app:layout_constraintLeft_toRightOf="@id/view"

(21)相对布局:

android:layout_above="@id/view" 

(21)约束布局等效:

app:layout_constraintBottom_toTopOf="@id/view"

(22)相对布局:

android:layout_below="@id/view" 

(22)约束布局等效:

app:layout_constraintTop_toBottomOf="@id/view"

ConstraintLayout的目的是通过对每个视图应用一些规则来避免嵌套,从而优化和平抑布局的视图层次结构。

规则类似于RelativeLayout,例如将底边设置为其他视图的底部。

app:layout_constraintBottom_toBottomOf="@+id/view1"

与RelativeLayout不同的是,ConstraintLayout提供了一个偏置值,用于相对于手柄(用红圈标记)的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 -->

Baseline句柄(圆角的长管道,在圆句柄的下面)用于将视图的内容与另一个视图引用对齐。

正方形句柄(在视图的每个角落)用于在dps中调整视图的大小。

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

我能得出的结论是

1)我们可以在不接触xml部分代码的情况下进行UI设计,老实说,我觉得谷歌已经复制了iOS应用程序中的UI设计,如果你熟悉iOS中的UI开发,这将是有意义的,但在相对布局中,很难在不接触xml设计的情况下设置约束。

2)其次,它具有平面视图层次结构,不像其他布局,因此性能比相对布局更好,你可能已经从其他答案中看到

3)除了相对布局之外,它还有一些额外的东西,比如圆形相对定位,我们可以将另一个视图相对于这个视图以一定的半径和一定的角度放置,这在相对布局中是做不到的

我再说一遍,使用约束布局设计UI和在iOS中设计UI是一样的,所以以后如果你在iOS上工作,你会发现使用约束布局会更容易

正式来说,ConstraintLayout要快得多

在Android N版本中,ConstraintLayout类提供了与RelativeLayout类似的功能,但成本要低得多。