嵌入式系统工程师面试,深入分析ConstraintLayout的原理及应用场景,1-3年的Android开发工程师看过来

ConstraintLayout的约束关系,使它具备了另一个特点,那就是可以添加引导线来辅助布局,所有布局都可以在界面上通过拖动完成。如图。

ConstraintLayout移动控件.png

点击layout布局后,选择图示右上角的Design按钮,即可拖动控件。

而RelativeLayout并不具备这一特点,这也让ConstraintLayout的布局调整更为方便、快捷。

如果此时非ConstraintLayout布局,在上图左方,右键点击最上部分的父容器,选择Convert XXX to Constraintlayout即可转化为约束布局。

ConstraintLayout布局转化.png

  • 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”

使用前导包
  1. 在顶级build.gradle文件中

repositories {
google()
}

  1. 模块级build.gradle

// 尽可能地下载最新版本,如果不确定最新版本号,可以先写入1.0.0,系统会标注提醒最新版本号.
dependencies {
implementation “androidx.constraintlayout:constraintlayout:2.0.4”
}

使用场景
  • 场景a:A控件与“222”控件居中对齐,且“222”控件在A控件下方。如图(即基于某控件的一边,居中对齐)

约束布局如图.png

代码实现如下:

<?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>

  1. 居中用法引申:同一维度(上下或左右)的两个方向同时出现,且相对于父布局对齐。
  2. 非居中用法引申:若不居中对齐,而是基于某一边对齐,只需去掉同一个维度的某一个方向。例如,上方代码中,去掉app:layout_constraintEnd_toEndOf=“@id/tv1”, 即实现A与“222”控件左方对齐,且A在“222”控件上方。
  • 场景2:六个控件在布局中以三行三列形式分布,且行均分布局高度,列均分布局宽度。如图。

ConstraintLayout场景2.png

核心实现流程如下:

  1. 每一个相对的控件,都要写出相约束的属性(比如layout_constraintEnd_toStartOf;layout_constraintStart_toEndOf)。
  2. 每个控件四个方向的约束位置都要写出来。
  3. 每一个横向或竖向位置的两端,必须与parent相对。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

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、安卓逆向、云计算*

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值