Android Layout大点兵

原文链接 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.mzph.cn/news/16950.shtml

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

相关文章

kotlin 编写一个简单的天气预报app(五)增加forcast接口并显示

参考资料 OpenWeatherMap提供了一个/forecast接口,用于获取未来几天的天气预报。你可以使用HTTP GET请求访问该接口,并根据你所在的城市或地理坐标获取相应的天气数据。 以下是一个示例请求的URL和一些常用的参数: URL: http://api.openwe…

K8s安全配置:CIS基准与kube-bench工具

01、概述 K8s集群往往会因为配置不当导致存在入侵风险,如K8S组件的未授权访问、容器逃逸和横向攻击等。为了保护K8s集群的安全,我们必须仔细检查安全配置。 CIS Kubernetes基准提供了集群安全配置的最佳实践,主要聚焦在两个方面:主…

C语言指针进阶-2

本篇文章带 1. 数组传参和指针传参 2. 函数指针 3. 函数指针数组 的相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见&…

(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码

参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性,以梯级水光互补系统的可消纳电量期望最大为目标,函数…

kernel32.dll如何修复,快速解决kernel32.dll缺失的方法

Kernel32.dll是Windows操作系统中一个重要的系统文件,对于系统的正常运行至关重要。然而,由于各种原因,用户可能会遇到kernel32.dll文件的缺失问题。今天小编就来给大家详细的介绍一下kernel32.dll这个文件,并且详细的介绍一下ker…

Iptables

常用名词 容器:存放东西 表(table):存放链的容器,防火墙的最大概念 链(chain):存放规则的容器 规则(policy):准许或拒绝规则 Iptables处理流程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上…

小程序通过ip+port+路径获取服务器中的图片

配置IIS 首先需要配置IIS。 打开控制面板,接下来的流程按下图所示。 安装好后,按“win”键,搜索IIS 选择一个ip地址,或手动填写,端口号按需更改 填写别名和物理路径,别名就是后续通过url访问物理…

html5播放器视频切换和连续播放的实例

当前播放器实例可以使用changeVid接口切换正在播放的视频。当有多个视频,在上一个视频播放完毕时,自动播放下一个视频时也可采用该处理方式。 const option {vid: 88083abbf5bcf1356e05d39666be527a_8,//autoplay: true,//playsafe: , //PC端播放加密视…

牛客网Verilog刷题——VL41

牛客网Verilog刷题——VL41 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器,比如说8.7分频的时钟信号,注意rst为低电平复位。提示:其实本质上是一个简单的数学问题,即如何使用最小公倍数得到时钟周期的分别频比。设小…

数据中台系列2:rabbitMQ 安装使用之 window 篇

RabbitMQ 是一个开源的消息队列系统,是高级消息队列协议(AMQP)的标准实现,用 erlang 语言开发。 因此安装 RabbitMQ 之前要先安装好 erlang。 1、安装 erlang 到 这里 下载本机能运行的最新版 erlang 安装包。如果本机没有装过 …

Mac/win开发快捷键、vs插件、库源码、开发中的专业名词

目录 触控板手势(2/3指) 鼠标右键 快捷键 鼠标选择后shift⬅️→改变选择 mac command⬅️:删除←边的全部内容 commadtab显示下栏 commandshiftz向后撤回 commandc/v复制粘贴 command ⬅️→回到行首/末 commandshift3/4截图 飞…

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表 需要支持下拉 且 还需要支持三级联动功能 目前应为PHPExcel 不在维护,固采用 PhpSpreadsheet 效果如图: 第一步:首先 使用composer 获取PhpSpreadsheet 我这里PHP 版本 7.4 命令如下: composer r…

富士通“Actlyzer”提供基于AI的基于视频的行为分析

想象一下这样的场景:一个男人走近一个家的前门,蹲下并检查钥匙孔。这是丢失房屋钥匙的居民还是客人?还是寻找入口点的窃贼?“Actlyzer”是一种新的人工智能安全系统,旨在区分这种情况。富士通实验室和研发中心的行为分…

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…

XtraBackup 8.0.33-28 prepare 速度提升 20 倍!

在这篇博文中,我们将描述 Percona XtraBackup 8.0.33-28 的改进,这显著减少了备份准备所需的时间,以便进行恢复操作。 Percona XtraBackup 中的这一改进显着缩短了新节点加入 Percona XtraDB 集群(PXC) 所需的时间。 …

Python - OpenCV识别条形码、二维码(已封装,拿来即用)

此代码可识别条形码和二维码,已封装好,拿来即用: import cv2 import pyzbar.pyzbar as pyzbar import numpy from PIL import Image, ImageDraw, ImageFontclass CodeScan():def __init__(self):super(CodeScan, self).__init__()def decode…

阿丹千问vue页面升级-使用Markdown形式展示回答--markdown-it库

阿丹: 在之前开发的阿丹千问 发现回复的文章格式使用 Markdown的格式。所以想使用Markdown的方式来给页面来个升级。 下面就是升级以及开发的过程。 升级思路 使用vue中的markdown-it库 在Vue页面中使用Markdown文档 安装markdown-it: 在Vue项目中…

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI+智能制造与机器人的现状与未来

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI智能制造与机器人的现状与未来 在过去的半年里,AI 相关技术取得了革命性突破,CSDN CMeet策划推出系列研讨会,深度探讨技术更新后的开发实践。然而,更重要的是如何对 AI 实…

设计模式:生成器模式

这个模式书上讲的比较简单,但是感觉精华应该是讲到了。 引用下其它博客的总结:生成器模式的核心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时,所有的报文都会被抓包。 我们在开发或测试时,只需要抓包某个域名下的报文 ,以“www.baidu.com”为例,不设置过滤器&…