Android Layout大点兵

news2024/11/25 23:18:12

原文链接 Android Layout大点兵

智能手机催生了移动互联时代,现如今移动应用越来越成为最为核心的终端。而GUI页面是移动互联终端的标配,做好一个GUI页面,是非常重要的,能极大的提升用户体验和用户满意度。安桌生态,自古以来(没那么久,自安桌流行以来)在GUI方面就逊于水果生态,GUI页面的美观程度,操作流畅度以及动效的优美程度,水果生态是远好于安卓生态的。好消息是近几年的版本谷歌在这些方面做了大量努力,几乎追平与水果平台的差距。特别是在support libraries(现在是叫AndroidX)里面加入一些在各方面都远好于标准API中的UI组件,现在只要稍加努力就可以做出与水果一样,甚至更炫酷的GUI页面。

现在,对于安卓开发人猿来说,做GUI页面时选择很多,比如实现一个简单页面,可以用FrameLayout,也可以用LinearLayout,实现列表时可以用ListView,也可以用RecyclerView,面对纷繁复杂的需求以及众多的选择,到底该如何做选择,就成一个令人头痛的事情,今天就对Android布局进行一次大点兵,聊聊这些布局到底该如何使用。

注意:这里面提到 的布局的意思是承担主页面的ViewGroup,比如页面的根布局。而不是指一些具体的内容渲染View(如TextView之于Text,ImageView之于Image)。

简单和够用

同样一个页面,实现的方式可以千奇百怪,就好比经典的“Hello,world”,就可以有很多种实现方法。文字肯定是用TextView,那么根布局用什么呢?可以用FrameLayout,可以用RelativeLayout,可以用LinearLayout,当然也可以用ListView,甚至是RecyclerView。对于产品同学来说,需求都可以实现了。但是可以并意味着就应该。

从工程和研发的角度来讲,实现方式要以够用和简单为首要原则,功能实现了仅仅是第一步,后续的维护成本是极其高昂的。代码首要是写给人看的,简单或者说优雅的实现方式,才能方便其他人理解,才可以降低维护成本。除此之外,代码也是写给CPU的,执行的性能和效率也是要考虑的因素,重型武器虽然也能杀死一只蚂蚁,但它耗费的资源相较于一根树枝来说,就大太多了。

过早优化是万恶之源,同理过于复杂的实现方案也是灾难之源。开发人猿要把简单和够用作为首要的原则。针对页面布局更是如此,能用普通的就用普通的,能用简单的就用简单的,功能实现了就可以,但是要尽可能以简单和便于理解作为标准。

布局大点兵

要想做出合适的选择,首先就需要对常用的布局进入了解,知道每种布局的优势和缺点,不同布局之间的区别,这样才能做出最佳的选择。

对于安卓的布局,可以分为三类,一是结构性布局,二是集合性布局,区别就在于数据是否是一个无限集合。比如像ListView它就是一个集合性布局,因为它可以显示无限个数据,只要往adapter里塞数据,列表就可以展示;而像LinearLayout就是一个结构性布局,虽然理论上它也可以塞无限个子view,但只能手动的塞,且性能会极其的差,毕竟它设计出来的目的,是沿一个方向排列一定数量的子View。

需要注意,不能简单的以可否滑动来作为布局的区分分类,因为结构性的布局,假如子View较多的话,外面包一层ScrollView也是可以滑动的;而集合性布局,假如数据 少于一屏的话,也是不可以滑动的。重点还是在于数据量。

结构性布局

FrameLayout

简单易用,重点应用场景是层叠,在水平和竖直方向都没有约束,因此它最适合用于页面的根布局,比如手机窗口的根节点,Activity的根节点,Dialog的根节点等等,都是FrameLayout。

因为FrameLayout重点在于层叠,所以有时候可以做一些Canvas级别的裁切,比如实现圆角,这时也可以用FrameLayout,对FrameLayout的draw时去做裁切,然后整体效果就是做出了圆角,这对于一些不方便做圆的View有帮助,比如像SurfaceView,本身不方便做圆角,因此可以面其上面包一层FrameLayout,就可以实现圆角。

LinearLayout

某一个方向的简单堆叠。最为方便的便是按比例排列,不过性能有影响。居中和对齐不如RelativeLayout方便。

RelativeLayout

特点就是每个子View必须指定相对于其他View的条件参数,以实现布局。强大且复杂,可以完全实现FrameLayout和LinearLayout。

特点是对于居中和对齐的支持很好,缺点就是性能差。且容易牵一发动全身。

GridLayout

非常适合表格形的页面,就好比计算器之类的,具体使用方法可以参考之前的文章。要点就在于子View呈表格形排列,且大部分的子View的尺寸是一致的,这时就可以考虑使用GridLayout。

ConstraintLayout

这个是AndroidX中增加的大杀器,使用方法可以参考这篇文章,可以胜任意的非集合性布局场景,可以完全替代前面提到的几种布局。

但为了避免滥用重武器,建议用ConstraintLayout替代LinearLayout和RelativeLayout就好。

集合性布局

ListView

集合性布局的典型代码,非常适合列表性数据。特点是简单易用。缺点是只能垂直方向滑动,每个条目元素的布局不宜复杂,并且对动画的支持不那么友好。当每个元素条目的布局非常简单时(如 就是简单的icon+文字)并且没有眼花聊乱的动画时,那么用这个也足够了。

GridView

与ListView类似,只不过是以表格形态来展示,简单易用,当每个无素条目较简单时,用这个比较合适,同样只支持垂直方向滑动。

RecyclerView

AndroidX中的集合性布局的大杀器,它重点在于Recycler,在渲染层面做了较多的优化,且布局方式跟ViewGroup本身没关系,有各种布局管理器来实现不同样式的布局,并且对动画的支持,也就是说每个元素条目的进入退出的动画的支持非常友好。

缺点就是使用起来较麻烦,目前已经变成了集合性布局的标准实现,但其实有被滥用的嫌疑,很多对于元素条目非常简单的场景没必要用它的。

ViewPager

水平方向多页布局的标准组件。其实把它称作集合性布局,略迁强,因为很多时候它的数据量并不像前面那几位那样多。需要注意它的适用场景是有很多页需要横向滑动展示时,这里页的意思是,每一屏只展示一个元素条目。

如何选择一个合适的布局

首先,要对数据量做区分,看是选择结构性布局还是集合性布局,然后再依据页面的复杂程度来做具体的选择。

其次,核心的原则是够用和简单,不能为了用而用,简单的实现功能能节省大量的维护成本。

具体的指导原则是:

  1. 应用的根布局或者页面的根布局建议用FrameLayout
  2. 稍复杂的LinearLayout和RelativeLayout一定要用ConstraintLayout来做
  3. 如有可能,可以多多用ConstraintLayout
  4. 对于集合性布局,如果元素条目简单,且无动画要求,那就用ListView或者GridView吧
  5. 如有可能,可以多多用RecyclerView
  6. 水平方向多页展示,没得说就用ViewPager

参考资料

  • Layouts
  • Linear Layout
  • Relative Layout
  • Build a Responsive UI with ConstraintLayout
  • Create dynamic lists with RecyclerView
  • AdapterView

原创不易,打赏点赞在看收藏分享 总要有一个吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-jQuery - width( val )方法函数

width(val)方法设置每个匹配元素的CSS宽度。 width( val ) - 语法 selector.width( val ) 这是此方法使用的所有参数的描述- val - 这是元素的宽度。如果未指定任何显式单位(如em或%),则将" px"连接到该值。 width( val ) - 示例 以…

免费MES系统:助力企业数字化转型的利器

在这个飞速发展的数字化时代,企业的竞争力和生产效率已经与传统模式发生天翻地覆的变化。为了跟上这个变化的步伐并引领未来的生产力,下面就详细介绍免费MES系统的优势和价值。 什么是MES系统? MES系统是一种通过数字化技术实现生产计划、监…

Cocos Store 免费游戏资源下载指南!

Cocos Creator 3.8.0 新版引擎即将发布,如果你还没有使用过 Cocos Creator 引擎,本文就带你从引擎的下载、安装、到游戏源码运行,只需要3分钟搞定,Lets Go! 01 下载 Cocos Dashboard 打开浏览器,进入 Cocos Store 资源…

STM32基础回顾

文章目录 单片机编程的原理GPIO中断EXTI外部中断定时器中断、串口中断 定时器定时器中断配置过程通用定时器输出比较功能:PWM波的生成定时器的输入捕获功能主从触发模式PWMI模式 定时器的编码器接口 DMA简介通信接口USART软件配置流程:1、仅发数据的配置…

2023-07-29:华清远见嵌入式2017年线下班:文件IO笔记

这里写目录标题 华清远见嵌入式2017年线下班:文件IO笔记文件权限文件IO文件创建和打开操作文件关闭操作出错处理创建设备文件 || create || 老师自己忘了文件读操作练习:计算文件的大小?文件写操作练习:打开file1和file2&#xff…

手机设置全局代理ip步骤

在互联网时代,隐私和安全问题备受关注。使用全局代理能够帮助我们保护个人信息,突破地理限制,并提高网络速度。但是,你是否对全局代理的安全性存有疑虑?而且,如何在手机上设置全局代理呢?今天就…

探索现代前端工程化工具与流程:提升开发效率和项目质量

文章目录 引言前端工程化的背景和发展1. 构建工具的出现2. 模块化开发3. 包管理工具的兴起4. 自动化测试和持续集成5. 组件化开发和前端框架的崛起 前端工程化对项目开发和团队协作的重要性 前端工程化基础前端工程化的定义和目标前端工程化的核心概念和原则 前端工程化工具与流…

nginx 301 Moved Permanently

1.nginx配置对比 --------------------------------------------- 2.postman特殊设置(postman在301情况下,会自动进行跳转,默认为自动跳转) 关闭自动跳转后 3. nginx 301分析 nginx 301情况如下 1.当location有最后一个斜杠,且proxy_pass后不带斜杠,会自动进行301跳转到带斜杠…

cad图像中的图标变成块的办法

在cad中想要一个半球图标,但是没有找到,只能自己修改原来的球机图标,重新画好后,进行“块”话操作,也就是把画好的图标变成“块”的办法; 1.把原来的“球机”图标经过多次“x”后,分解变成“线段…

Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)

HDFS HDFS概述1.1 HDFS 产出背景及定义1)HDFS产生背景2)HDFS定义 1.2 HDFS 优缺点1.3 HDFS 组成架构1.4 HDFS 文件块大小(面试重点) 2.HDFS的Shell操作(开发重点)2.1 基本语法2.2 命令大全2.3 常用命令实操…

在云服务器上,clone github时报Connection timed outexit code: 128

文章目录 问题解决方案 问题 在执行pip install安装依赖时,需要clone github代码,此时报了Connection timed out&exit code: 128错误,原因是访问超时了,此时需要使用代理 fatal: unable to access https://github.com/hugg…

认识C语言

目录 1.C语言的发展历史 2.C语言的特点 3.C语言的应用领域 1.C语言的发展历史 C语言的发展历史可以追溯到20世纪60年代。在那个时候,计算机科学领域存在着多种编程语言,但它们在功能、效率和可移植性等方面存在一些限制。 C语言的起源可以追溯到贝尔实…

Python(五十四)列表元素的删除操作

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

接口和类的区别,超通俗化解释

接口告诉你,你可以有很多赚钱方式,接着你家几代人都通过各种方式赚钱,并把所有赚钱方式都告诉了你。

MAC下配置android-sdk

MAC下配置android-sdk 1、前提2、brew安装3、配置sdk 1、前提 安装好JDK安装brew 2、brew安装 brew install android-sdk brew install android-platform-tools检查是否安装成功 android3、配置sdk brew list android-sdk进入配置文件 sudo vim ~/.zshrc配置 export AND…

MySQL 数据库事务

前言 事务概念及特性 事务是指数据库操作的一个逻辑单位,它由一组被视为一个整体的数据库操作组成。 事务具有以下特性: 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务…

MySQL的使用——【初识MySQL】第二节

MySQL的使用——【初识MySQL】第二节 文章目录 MySQL环境变量的配置(如使用Navicat可忽略)使用命令行连接MySQL(如使用Navicat可忽略)步骤注意 NavicatNavicat的下载Navicat的使用连接MySQL新建表 总结总结 MySQL环境变量的配置&a…

新手入门吉他买什么好?千元内VEAZEN费森VZ200和恩雅X1pro综合评测,你会选新型材质HPL还是传统木吉他?

千元内入门吉他少不了VEAZEN费森VZ200单板系列和恩雅X1 PRO系列这两款热门系列,最近很多初学者朋友来私信,咨询这两款琴有什么优缺点,哪一款更值得初学者选购,那么今天,就以它们为本期的评测主角,全方位评测…

【《C# 10 和 .NET 6入门与跨平台开发(第6版)》——一本循序渐进的C#指南】

这个新版本对上一版做了全面修订,涵盖C# 10和.NET 6的所有新功能. 本书讨论面向对象编程、编写函数、测试函数、调试函数、实现接口以及继承类等主题;介绍.NET API,这些API可执行多种任务,如管理和查询数据,监视和改进…

vue组件方法 ref this.refs

在父组件中引入子组件,通常需要在父组件调用子组件的方法。就用到了组件方法 this.refs 使用前 需要在子组件模板定义 ref方法名 例如:红框所示 ref"name" //name为自定义名字 父组件使用时 只需要调用 this.$refs.name.子组件方法()&#x…