我对ConstraintLayout和RelativeLayout之间的区别感到困惑。有人能告诉我它们之间的确切区别吗?
当前回答
我能得出的结论是
1)我们可以在不接触xml部分代码的情况下进行UI设计,老实说,我觉得谷歌已经复制了iOS应用程序中的UI设计,如果你熟悉iOS中的UI开发,这将是有意义的,但在相对布局中,很难在不接触xml设计的情况下设置约束。
2)其次,它具有平面视图层次结构,不像其他布局,因此性能比相对布局更好,你可能已经从其他答案中看到
3)除了相对布局之外,它还有一些额外的东西,比如圆形相对定位,我们可以将另一个视图相对于这个视图以一定的半径和一定的角度放置,这在相对布局中是做不到的
我再说一遍,使用约束布局设计UI和在iOS中设计UI是一样的,所以以后如果你在iOS上工作,你会发现使用约束布局会更容易
其他回答
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的印象
由@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
相对布局和约束布局的等效属性
(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仍然尊重约束。所以它不会破坏布局如果你有一个链你想让一个视图消失在中间。
真正要问的问题是,是否有理由使用约束布局以外的任何布局?我相信答案可能是否定的。
对于那些坚持认为它们是针对新手程序员或类似的人,它们应该提供一些理由来证明它们不如其他任何布局。
约束布局在各个方面都更好(它们的APK大小确实花费了150k)。它们更快、更简单、更灵活,能够更好地应对变化,能够在项目消失时修复问题,能够更好地适应完全不同的屏幕类型,并且不会使用一堆嵌套的循环和长长的树形结构。你可以把任何东西放在任何地方,相对于任何地方。
它们在2016年年中有点古怪,可视化布局编辑器不够好,但它们已经到了这样的地步,如果你有一个布局,你可能会认真考虑使用约束布局,即使它做的事情与RelativeLayout相同,甚至是一个简单的线性布局。框架布局显然仍然有他们的目的。但是,在这一点上,我看不到任何其他东西。如果从这个开始,就不会再加其他东西了。
推荐文章
- 何时在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已弃用