我对ConstraintLayout和RelativeLayout之间的区别感到困惑。有人能告诉我它们之间的确切区别吗?
当前回答
相对布局和约束布局的等效属性
(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)相对布局:
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"
The only difference i've noted is that things set in a relative layout via drag and drop automatically have their dimensions relative to other elements inferred, so when you run the app what you see is what you get. However in the constraint layout even if you drag and drop an element in the design view, when you run the app things may be shifted around. This can easily be fixed by manually setting the constraints or, a more risky move being to right click the element in the component tree, selecting the constraint layout sub menu, then clicking 'infer constraints'. Hope this helps
由@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
一个很大的区别是,即使视图消失了,ConstraintLayout仍然尊重约束。所以它不会破坏布局如果你有一个链你想让一个视图消失在中间。
推荐文章
- 何时在Android中使用RxJava,何时使用Android架构组件中的LiveData ?
- 如何在Android项目中使用ThreeTenABP
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 我的Android设备没有出现在adb设备列表中
- 在没有安装apk的情况下获取Android .apk文件的VersionName或VersionCode
- Fragment onResume() & onPause()不会在backstack上被调用
- 如何设置基线对齐为假提高性能在线性布局?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 如何改变TextInputLayout的浮动标签颜色
- Android工作室如何运行gradle同步手动?
- 如何以编程方式在我的EditText上设置焦点(并显示键盘)
- 如果在片段和活动中同时定义,则不会在片段中调用onRequestPermissionsResult
- 方法setDrawerListener已弃用