* 1 子控件和子控件之间的约束(如android:layout_below="@id/title"
)
* 2 子控件和父控件的约束(如 android:layout_alignParentTop="true"
)
现在ConstraintLayout
也是类似的,只不过除了以上两种约束,还多了一种
* 3 子控件和Guideline
的约束
其实关于和Guideline
的约束,也可以理解成约束1,因为Guideline
其实就是一个在屏幕上不显示的View罢了。稍后讲到Guideline
会带大家看看它巨简单的源码。
下面开始正文,开始属性的讲解
相对定位 (Relative positioning)
这一节的属性和相对布局的很像,
值得注意的是参数取值是 ID(@id/button1
)代表约束1、3, 或者 字符串"parent"
代表约束2:
* layout_constraintLeft_toLeftOf
* layout_constraintLeft_toRightOf
* layout_constraintRight_toLeftOf
* layout_constraintRight_toRightOf
* layout_constraintTop_toTopOf
* layout_constraintTop_toBottomOf
* layout_constraintBottom_toTopOf
* layout_constraintBottom_toBottomOf
* layout_constraintBaseline_toBaselineOf
* layout_constraintStart_toEndOf
* layout_constraintStart_toStartOf
* layout_constraintEnd_toStartOf
* layout_constraintEnd_toEndOf
属性都形如layout_constraintXXX_toYYYOf
,
这里我的理解,constraintXXX
里的XXX
代表是这个子控件自身的哪条边(Left、Right、Top、Bottom、Baseline
),
而toYYYOf
里的YYY
代表的是和约束控件的哪条边 发生约束 (取值同样是 Left、Right、Top、Bottom、Baseline
)。
当XXX
和YYY
相反时,表示控件自身的XXX
在约束控件的YYY
的一侧,
例如app:layout_constraintLeft_toRightOf="@id/button1"
,表示的是控件自身的左侧在button1的右侧。
当XXX
和YYY
相同时,表示控件自身的XXX
和约束控件的YYY
的一侧 对齐,
例如:app:layout_constraintBottom_toBottomOf="parent"
,表示控件自身底端和父控件底端对齐。
代码为:
<Button
android:id=“@+id/button1”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Demo”/>
<Button
android:id=“@+id/button2”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“button2”
app:layout_constraintLeft_toRightOf=“@id/button1”/>
<Button
android:id=“@+id/button3”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginBottom=“20dp”
android:text=“button3 跳转match页”
app:layout_constraintBottom_toBottomOf=“parent”/>
图示:
Margins
margin和以往的使用一致,注意margin**不能为负值**即可。
在上图中也顺便展示了margin的使用。
当约束的widget为GONE时的Margins
Margins when connected to a GONE widget
举例,当A控件 约束 在B控件的左边,B控件GONE了,此时A会额外拥有一个margin的能力,来“补充”B消失的导致的“位移”。
这就是本节的属性。
这一节的属性开始我并没有理解,后来是通过写了一些Demo实验才明白。奈何官方文档惜字如金,只有一句话,并没有Demo展示:
When a position constraint target’s visibility is View.GONE, you can also indicates a different margin value to be used using the following attributes:
先看属性:
* layout_goneMarginStart
* layout_goneMarginEnd
* layout_goneMarginLeft
* layout_goneMarginTop
* layout_goneMarginRight
* layout_goneMarginBottom
在看Demo:
<Button
android:id=“@+id/button4”
android:layout_width=“100dp”
android:layout_height=“wrap_content”
android:text=“button4”
app:layout_constraintRight_toRightOf=“parent”
/>
<Button
android:id=“@+id/button5”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginRight=“10dp”
android:text=“button5”
app:layout_constraintRight_toLeftOf=“@id/button4”
app:layout_goneMarginRight=“110dp”/>
此时图示:
当给button4 隐藏GONE掉以后:
图示:
会发现Button5纹丝不动,并没有收到Button4消失的影响。
这里我们再仔细看看button4的android:layout_width="100dp"
,
而button5的android:layout_marginRight="10dp"
,app:layout_goneMarginRight="110dp"
110 = 100 +10 , 这是一道小学计算题。
什么意思?
几个注意事项:
* app:layout_goneMarginRight
要配合android:layout_marginRight
一起使用。
* 如果只设置了app:layout_goneMarginRight
没有设置android:layout_marginRight
,则无效。(alpha版本的bug,1.0.1版本已经修复)
* 在约束的布局gone时,控件自身的marginXXX
会被goneMarginXXX
替换掉,以本文Demo为例,原本button4宽度是100,button5的marginRight
是10, 加起来是110,如果想让button4隐藏之后,button5仍然纹丝不动,则需要设置goneMarginRight
为10+100 = 110.
居中定位和倾向(Centering positioning and bias)
居中定位
约束布局一个有用的地方是它如何处理“不可能”的约束。
比如你定义如下:
<android.support.constraint.ConstraintLayout
…
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“button”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”/>
</android.support.constraint.ConstraintLayout>
按照我们第一小节讲的属性值,这个定义的意思是,Button的左边和父控件的左边对齐,Button的右边和父控件的右边对齐。
可是控件是wrap_content
的,它如果不铺满父控件要如何能满足这两个约束呢?
实际效果如下:
控件会居中显示,因为这两个约束作用 类似于 水平方向上,有相反的力 去拉控件,最终控件会居中显示。
倾向(Bias)
搭配bias,能使约束偏向某一边,默认是0.5,有以下属性:
* layout_constraintHorizontal_bias (0最左边 1最右边)
* layout_constraintVertical_bias (0最上边 1 最底边)
比如上个Demo,我加入app:layout_constraintHorizontal_bias="0.9"
,则会在水平方向上向右偏移至90%。
<android.support.constraint.ConstraintLayout
…
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<Button
…
app:layout_constraintHorizontal_bias=“0.9”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”/>
</android.support.constraint.ConstraintLayout>
对可见性的处理(Visibility behavior)
这一节是对前一节goneMargin
的补充。
重点是Gone隐藏掉的控件,会被解析成一个点,并忽略margin。
ConstraintLayout
能为View.Gone
的View
特殊处理。
通常,GONE的控件不会被显示,并且不是布局本身的一部分(即如果标记为GONE,则其实际尺寸并不会更改)。
但是在布局计算方面,GONE的View仍然是其中的一个重要区别:
对于布局传递,它们的维度将被视为零(基本上它们将被解析为一个点)
如果他们对其他小部件有约束力,那么他们仍然会受到尊重,但任何margin都将等于零
注意A的margin也被忽略了。
拿上个Demo改一下,为A 加上一个android:layout_marginRight="10dp"
,
为了使A 隐藏后,B仍能纹丝不动,则B的app:layout_goneMarginRight="120dp"
。
B goneMarginRight120 = A宽度100 + A marginRight10 +B marginRight10
<Button
android:id=“@+id/button4”
android:layout_width=“100dp”
android:layout_height=“wrap_content”
android:layout_marginRight=“10dp”
android:text=“button4”
app:layout_constraintRight_toRightOf=“parent”
/>
<Button
android:id=“@+id/button5”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginRight=“10dp”
android:text=“button5”
app:layout_constraintRight_toLeftOf=“@id/button4”
app:layout_goneMarginRight=“120dp”/>
尺寸约束(Dimensions constraints)
ConstraintLayout的最小尺寸 (Minimum dimensions on ConstraintLayout)
可以为ConstraintLayout
自身定义最小的尺寸,他会在 ConstraintLayout
为WRAP_CONTENT
时起作用。
● android:minWidth
● android:minHeight
控件尺寸约束(Widgets dimension constraints)
控件的宽高有三种方式为其设置:
* 确定尺寸
* WRAP_CONTENT
* 0dp
,就等于MATCH_CONSTRAINT
有些人可能有疑问,为什么不用MATCH_PARENT
了。
官方文档如是说:
MATCH_PARENT is not supported for widgets contained in a ConstraintLayout, though similar behavior can be defined by using MATCH_CONSTRAINT with the corresponding left/right or top/bottom constraints being set to “parent”.
意思是MATCH_PARENT
不再被支持了,通过MATCH_CONSTRAINT
替代。
我们写个Demo看一下三种方式设置的效果吧:
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout
…
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<Button
android:id=“@+id/button”
android:layout_width=“200dp”
android:layout_height=“100dp”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintTop_toTopOf=“parent”/>
<Button
android:id=“@+id/button10”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“@+id/button”
app:layout_constraintRight_toRightOf=“@+id/button”
app:layout_constraintTop_toBottomOf=“@+id/button”/>
<Button
android:id=“@+id/button11”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“@+id/button10”
app:layout_constraintRight_toRightOf=“@+id/button10”
app:layout_constraintTop_toBottomOf=“@+id/button10”/>
</android.support.constraint.ConstraintLayout>
效果如图:
有些人是不是要说,你特么逗我,不是说好的0dp等于MATCH_CONSTRAINT
,应该是撑满屏幕的呀,
OK ,把刀放下。让我们仔细看这个MATCH_CONSTRAINT
属性。它match的是约束。
而这里第三个按钮的约束是第二个按钮,所以它的宽度设置为MATCH_CONSTRAINT
时,是和它的约束按钮,即第二个按钮一样宽。
注意,此时,竖直方向上没有约束,所以不能使用MATCH_CONSTRAINT
属性.
我们仅仅将第三个按钮的属性修改为
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”
则它宽度会撑满屏幕:
我们再修改Demo,分别为后两个按钮加上margin:
<android.support.constraint.ConstraintLayout
…
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<Button
android:id=“@+id/button”
android:layout_width=“200dp”
android:layout_height=“100dp”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintTop_toTopOf=“parent”/>
<Button
android:id=“@+id/button10”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“@+id/button”
app:layout_constraintRight_toRightOf=“@+id/button”
app:layout_constraintTop_toBottomOf=“@+id/button”/>
<Button
android:id=“@+id/button12”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
app:layout_constraintLeft_toLeftOf=“@id/button10”
app:layout_constraintRight_toRightOf=“@id/button10”
app:layout_constraintTop_toBottomOf=“@id/button10”/>
<Button
android:id=“@+id/button11”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:layout_marginRight=“10dp”
android:text=“Button”
app:layout_constraintLeft_toLeftOf=“parent”
app:layout_constraintRight_toRightOf=“parent”
app:layout_constraintTop_toBottomOf=“@+id/button12”/>
</android.support.constraint.ConstraintLayout>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
面试复习路线,梳理知识,提升储备
自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。
关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
资料获取方式:前往我的GitHub
- 架构师筑基必备技能
- Android高级UI与FrameWork源码
- 360°全方面性能调优
- 解读开源框架设计思想
- NDK模块开发
- 微信小程序
- Hybrid 开发与Flutter
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
s.csdn.net/topics/618156601)**
- 架构师筑基必备技能
- Android高级UI与FrameWork源码
- 360°全方面性能调优
- 解读开源框架设计思想
- NDK模块开发
- 微信小程序
- Hybrid 开发与Flutter
[外链图片转存中…(img-VzitlPiE-1711051535075)]
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:
[外链图片转存中…(img-QtvLWyIz-1711051535076)]
《960全网最全Android开发笔记》
[外链图片转存中…(img-HyTVc35I-1711051535076)]
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
[外链图片转存中…(img-miBIB69Q-1711051535077)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。