然后,在工具栏中同步 Gradle
文件。
创建布局
接下来,我们创建一个布局,根布局就用 ConstraintLayout
:
<android.support.constraint.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”>
</android.support.constraint.ConstraintLayout>
添加约束
添加约束十分简单,我们首先从 Design
界面的 Palette
操作栏拖动一个 Button
到蓝图中,添加完后,点击选中它,效果是这样的:
可以看到,上下左右都有一个小圆圈,这个圆圈就是用来添加约束的。 四个角的矩形,是用来扩大或缩小控件的。
:删除选中控件的所有约束。
:编辑基线,用于基线对齐(下面会说)。
现在我们来为这个 Button
添加约束:
看这个效果,有没有一种「五马分尸」的感觉?当只有一条边拉这个 Button
时,Button
马上就被拉过去了,但是当四个边都开始拉这个 Button
时,Button
就在中间动弹不得了。
看完了动图,我们再来看看 XML
布局中的变化:
因为我们的目的是想让这个 Button
居中,但是它却默认给我们添加了 margin
,这个显然是多余的。
如果不想每次添加约束后都在这条边的约束上添加 margin
,我们可以在上面的工具栏中进行设置:
抛去 margin
相关的属性,那么约束父控件的相关属性就是如下这些了:
app:layout_constraintTop_toTopOf=“parent”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”
app:layout_constraintBottom_toBottomOf=“parent”
在上面的图中我们已经看到了,每个控件的上下左右都有一个圆圈,用于添加约束的。
那么这些属性的 constraintXXX
就是指定的当前控件的约束位置的,而 toXXX
就是目标约束位置。
这个位置可以是上面的例子一样是 parent
(也就是父控件),也可以是另一个控件。
接下来我们再来看看对于其他控件的约束。
再拖一个 Buttton
进入蓝图中,然后给这个 Button
添加约束:
XML
布局:
添加完约束了,如果要删除指定的单个约束的话,单击变红的圆圈即可:
或者是上面提到了,删除指定控件的所有约束。
或者是工具栏中的,删除页面所有的约束:
基线约束
基线约束的作用就是将视图的文本基线与另一个视图的文本基线对齐:
添加完成后,在 XML
布局中,B 控件就会多出这么一个属性:
app:layout_constraintBaseline_toBaselineOf=“@+id/a”
该属性就是用于基线对齐的。
Chains
Chains
(链)是一种特定的约束,一个链包含了多个视图,它允许链中的视图共享空间,并控制可用空间在它们之间如何分配。该效果与 LinearLayout
的 Weiget
类似,但是链的作用远远超过它。
我们要是想创建一个链,那么首先就需要创建多个视图控件,然后再选择是创建「水平链」还是「垂直链」。 让我们从三个视图中创建一个「水平链」:
「垂直链」:
以「水平链」为例,我们来看看它们的样子:
可以发现,两侧控件的约束样子和前面约束的样子是一样的,我把它称之为「单约束」,也就是两侧控件只是单方面的约束了对方(这里是父控件)。
而中间的控件,两侧的约束则是链条的样子,这表示它约束了左右侧控件,而左右侧控件同样也约束了它:「互相约束」。
在 XML
布局中,是通过如下属性实现的:
我们刚刚创建好了一条链,此时我们可以设置 Cycle Chain Mode
(链式模式)来告诉 Chains
:“你应该怎样去填充剩余的空间”。
在「蓝图」中,设置的方式是点击链条的小图标:
在「布局」中,设置的属性是:
layout_constraintHorizontal_chainStyle
layout_constraintVertical_chainStyle
分别对应着「水平链」和「垂直链」。
有三种可选的参数:
- spread:将可用空间以均匀分布的方式将视图放置在链中(默认模式):
- spread_inside:将链中最外面的视图对齐到外边缘,然后在可用空间内均匀的放置链中的其他视图:
- packed:将链中的视图紧紧的放在一起(可以提供边距让其分开),然后让其居中在可用空间内:
除了上面说的之外,Chains
还能对链中单独的视图控件设置 Weiget
。因为目前并不支持在编辑器当中设置 Weiget
,所以我们只能在布局中进行设置了,设置的属性是:
layout_constraintHorizontal_weight
layout_constraintVertical_weight
我们现在将第一个 Button
填充完剩余的空间,在该 Buttton
上设置如下属性:
android:layout_width=“0dp”
app:layout_constraintHorizontal_weight=“1”
使用和 LinearLayout
的 Weiget
一致,很好理解。
Properties
基本的添加、删除约束我们已经掌握了,那么现在再来将目光转向右侧的 Properties
区域。
该区域分为了上下两个部分,下部分就是选中控件的一些属性什么的,很好理解。
重点来看看上半部分,该部分被称为:Inspector
区域。
首先来看这些数字,很明显就是当前控件的 margin
值,我们可以直接在上面进行修改:
还有就是左边和下边的两个轴,我把它称之为纵横轴。作用是用于确定控件位置的:
根据上图可以看到,因为该控件同时添加了水平和垂直约束,所以两条轴都可以进行操作。 轴上面的数字是比例,对应的属性如下:
app:layout_constraintVertical_bias=“0.5”
app:layout_constraintHorizontal_bias=“0.5”
再来看看中心区域:
四条边的原点就是添加的约束,点击的作用是删除该约束。
重要的是中心的 >>>
,这个代表了当前控件的宽高计算方式。点击是可以切换的,一共有三种:
:这个代表的就是
wrap_content
,不用过多解释了。:这个就是指定宽高的大小。
:这个代表的是:
Match Constraints
(有点类似于match_parent
),就给强翻成约束匹配吧… 这个是ConstraintLayout
特有的,它会尽可能扩展以满足各方的约束(在考虑视图边界之后)。但是,可以使用以下属性和值修改该行为(只有在将视图宽度设置为与约束匹配时,这些属性才会生效):- layout_constraintWidth_default:
- spread:这是默认的行为,它会尽可能的扩展视图来满足约束。
- wrap:与上面所说的
wrap_content
不同的是,虽然都是适应内容,但仍然允许视图比约束要求的视图更小。 - layout_constraintWidth_min:指定视图的最小宽度(dp)。
- layout_constraintWidth_max:指定视图的最大宽度(dp)。
下面来几个例子,演示下约束匹配的效果,比如说,要让一个 Button
宽度填充满,仅需要将宽度设置为 0dp
即可:
android:layout_width=“0dp”
如果是两个 Button
:
效果:
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-oiOue3EG-1714451467262)]
【算法合集】
[外链图片转存中…(img-RN40NO54-1714451467262)]
【延伸Android必备知识点】
[外链图片转存中…(img-orCwvNTJ-1714451467263)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!