ConstraintLayout的约束关系,使它具备了另一个特点,那就是可以添加引导线来辅助布局,所有布局都可以在界面上通过拖动完成。如图。
点击layout布局后,选择图示右上角的Design按钮,即可拖动控件。
而RelativeLayout并不具备这一特点,这也让ConstraintLayout的布局调整更为方便、快捷。
如果此时非ConstraintLayout布局,在上图左方,右键点击最上部分的父容器,选择Convert XXX to Constraintlayout即可转化为约束布局。
- RelativeLayout、ConstraintLayout都可以通过LayoutParams动态新建布局,即在代码中控制控件尺寸和位置,而不只是在xml文件中设置静态的布局。但是,ConstraintLayout引入了一个新的类,即ConstraintSet,使它可以实现动画效果,对控件的控制能力也更加强大,这是RelativeLayout不具备的能力。
- 性能上,ConstraintLayout的渲染速度比RelativeLayout更快。
原因:
在布局上RelativeLayout内比ConstraintLayout多了一层ViewGroup,如这样一种情况,屏幕分成两半,左半部分只有一个button,右半部分从上到下有多个button,左边的button需要居中对齐右边,那么便需要将右半部分的多个button用一个viewgroup包裹起来。这样便多了一层嵌套,渲染时间增加。
值得注意的是,LinearLayout的渲染速度也快于RelativeLayout,原因:因为RelativeLayout通过在水平、垂直方向对另一控件的依赖,来计算自身的位置,因此会执行两遍measure,而LinearLayout只需测量一次。ConstraintLayout是RelativeLayout的升级版,LinearLayout的渲染速度同样快于ConstraintLayout。
因此对于层次不深的简单布局,优先使用LinearLayout。
这里可能会有人有疑惑,那层次深与不深又怎么划分呢?三层、四层算深还是五层、六层?
个人的想法是,如果布局仅有一层,不需嵌套,直接使用LinearLayout;如果嵌套多于一层,而根布局需要采用RelativeLayout或ConstraintLayout时,可以直接采用ConstraintLayout。
ConstraintLayout使用条件与场景
使用条件
- ConstraintLayout布局内的控件必须有水平方向和垂直方向的约束,来表示与父布、兄弟控件的连接或对齐。
- 水平方向上,start和end为一组。
- 垂直方向上,top和bottom为一组。
约束如下。
//与父布局底部对齐(parent可改为其他控件ID,即与其他控件底部对齐,下同)
app:layout_constraintBottom_toBottomOf=“parent”
//与父布局顶部对齐
app:layout_constraintTop_toTopOf=“parent”
//与父布局左端对齐
app:layout_constraintStart_toStartOf=“parent”
//与父布局右端对齐
app:layout_constraintEnd_toEndOf=“parent”
//在父布局的上方(看属性最右边的元素,即Top,下同)
app:layout_constraintBottom_toTopOf=“parent”
//在父布局的下方
app:layout_constraintTop_toBottomOf=“parent”
//在父布局的右方
app:layout_constraintStart_toEndOf=“parent”
//在父布局的左方
app:layout_constraintEnd_toStartOf=“parent”
使用前导包
- 在顶级build.gradle文件中
repositories {
google()
}
- 模块级build.gradle
// 尽可能地下载最新版本,如果不确定最新版本号,可以先写入1.0.0,系统会标注提醒最新版本号.
dependencies {
implementation “androidx.constraintlayout:constraintlayout:2.0.4”
}
使用场景
- 场景a:A控件与“222”控件居中对齐,且“222”控件在A控件下方。如图(即基于某控件的一边,居中对齐)
代码实现如下:
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.MainActivity”>
//因为要位于下方,所以使用layout_constraintTop_toBottomOf属性;
//同时左右两边要基于另一控件对齐(因为要居中)
</androidx.constraintlayout.widget.ConstraintLayout>
- 居中用法引申:同一维度(上下或左右)的两个方向同时出现,且相对于父布局对齐。
- 非居中用法引申:若不居中对齐,而是基于某一边对齐,只需去掉同一个维度的某一个方向。例如,上方代码中,去掉app:layout_constraintEnd_toEndOf=“@id/tv1”, 即实现A与“222”控件左方对齐,且A在“222”控件上方。
- 场景2:六个控件在布局中以三行三列形式分布,且行均分布局高度,列均分布局宽度。如图。
核心实现流程如下:
- 每一个相对的控件,都要写出相约束的属性(比如layout_constraintEnd_toStartOf;layout_constraintStart_toEndOf)。
- 每个控件四个方向的约束位置都要写出来。
- 每一个横向或竖向位置的两端,必须与parent相对。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
面试复习笔记
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960页Android开发笔记》
《1307页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算*