深入剖析Compose布局, 一步步教你打造自适应UI界面

news2024/10/7 4:36:58

理解Compose布局

Compose 是一种基于声明式编程的 Android UI 工具包,它将可组合的 UI 要素视为函数,并使用 Kotlin DSL 进行构建和组合。Compose 还提供了相应的布局系统和一组用于嵌套和组合 UI 要素的基本函数。

Compose 的核心布局系统由两个部分组成:布局以及约束和测量系统。

  • 布局系统是抽象的组合 UI 要素的方式,它基于屏幕坐标系将所有元素放置到屏幕上,对于组合 UI 要素,布局系统提供了许多不同的布局选项。当使用布局系统时,您将结果视为一系列标记,其中每个标记表示一个 UI 元素。因此,使用布局系统时与使用传统布局 View 和 ViewGroup 时的操作相似,但语法更直观且更易于使用。
  • 约束和测量系统是基于标记来评估 UI 布局的约束和测量,它负责将布局数据传递给布局引擎进行实际计算。约束是一组布局参数,它控制 UI 元素在布局中的位置和大小。在 Compose 中,约束是通过布局系统函数提供的参数进行指定的。
  • 测量系统是对 UI 组件大小的计算。它对于实现某些布局非常重要,特别是在实现大型 UI 布局时。在 Compose 中,您可以选择使用预设的测量系统函数或为特定 UI 组件定制测量系统。

当您在 Kotlin 中编写 Compose UI 代码时,所编写的代码被编译成字节码,并使用底层渲染引擎进行实际渲染。该引擎将字节码转化为 GPU 可以理解的命令,从而实现在屏幕上显示 UI 元素。

Compose原理

Compose 的核心原理是声明式编程,采用函数式编程的风格来组合和构建 UI 元素。这种方式允许开发人员以一种更直接且易于理解的方式构建用户界面,而不必担心管理状态或处理事件。

Compose 通过使用 Kotlin 语言中的高阶函数、扩展函数和 DSL 的方式,允许开发人员将 UI 元素编写为独立的小组件,这些组件可以随心所欲地组合和重用。 例如,开发人员可以编写一个自定义的 UI 控件,该控件可以根据给定的输入值来生成不同的文本或图像。此控件可以与其他 UI 控件组合使用,以构建更高级别的 UI 页面。

而在 Compose 中,不需要直接操作低级别的 View 和 ViewGroup 对象。这是因为 Compose 将 UI 声明式和无状态化,这意味着开发人员不必在代码中跟踪状态并管理视图的层次结构,从而更容易维护和重构代码。

最后,Compose 使用基于 data-binding 的方式帮助实现数据驱动的 UI,这种方法可以让 UI 控件自动根据数据的变化进行更新。这种方法使得页面的数据与 UI 元素之间的关系更加明确,降低了代码中的错误风险,并加快了开发速度。

Compose 如何配置布局

在 Jetpack Compose 中,可以使用 Modifier 对象来配置 Composable 函数返回的 UI 控件和布局。通过链式调用 Modifier 对象的不同方法,可以实现多种布局和 UI 效果。

以下是一些常用的 Modifier 方法:

  • padding():设置视图周围的内边距。
  • background():设置视图的背景色或背景 drawable。
  • fillMaxWidth() 和 fillMaxHeight():将视图填满其父布局的宽度或高度。
  • width() 和 height():设置视图的宽度或高度。
  • wrapContentWidth() 和 wrapContentHeight():设置视图的宽度或高度为内容的宽度或高度。
  • clickable():将视图设置为可点击,并指定点击事件的处理器。
  • align():在父布局中对齐视图。

使用这些方法可以轻松地实现各种 UI 效果。例如,可以使用 padding() 方法设置一个视图的内边距,使其周围留出一些空白:

Text(
    text = "Hello, Compose!",
    Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp)
)

在这个例子中,我们使用 Modifier.padding() 方法为一个文本视图添加了一些内边距,使其周围留出了 8dp 的空白。

除了上述方法外,还可以使用更高级的 Modifier 方法,例如 constrainAs() 和 aspectRatio() 等,来更灵活地布局控件和设置其尺寸。

除了使用 Modifier 方法外,还可以使用样式(Style)来设置多个视图的通用属性,以及主题(Theme)来设置整个应用程序的风格和颜色。

总之,在 Jetpack Compose 中,通过使用 Modifier 对象,可以给 UI 视图添加各种布局和效果,并以一种简单、可读性强的方式进行配置。

Compose 标准布局组件

在 Jetpack Compose 中,有多种标准布局组件可用于构建 UI。以下是一些常用的标准布局组件:

  • Row 和 Column:这些组件允许你在水平和垂直方向上排列子组件,并指定它们之间的间距。
  • Box:Box 组件是一个类似于 FrameLayout 的容器,可以将子组件放置于不同的位置和大小。Box 组件也可以用作其它布局的基础组件,例如 Scaffold 和 Surface。
  • BoxWithConstraints:与 Box 类似,在 BoxWithConstraints 组件中,你可以指定子组件的位置和大小。与 Box 不同的是,BoxWithConstraints 还允许你检查其自身实际大小,从而决定如何布局其子组件。
  • ConstraintLayout:与 ConstraintLayout 相似,ConstraintLayout 组件允许你使用约束来布局子组件。与传统的 XML 布局相比,ConstraintLayout 更加灵活和直观,并且也可以更好地支持可屏幕大小和方向变化的适应性。
  • ScrollView:ScrollView 组件允许你将子组件放置在滚动视图中,以便用户可以滚动并查看视图中的内容。
  • LazyColumn 和 LazyRow:这些组件是可滚动的列和行,仅生成在视图中可见的部分子组件,可以优化性能。
  • Spacer:Spacer 组件可以添加空间,使子组件之间保持一定的距离。可以在 Row、Column 和 Box 中使用。

可以通过使用这些标准布局组件,结合 Modifier 对象和其它 Composable 函数,轻松地构建复杂的 UI 布局。

Compose布局简单使用代码示例

Compose 提供了一种基于代码声明的布局方式,即使用 Composable 函数声明 UI 布局。以下是一个简单的 Composable 函数示例,用于声明一个包含两个文本框的垂直线性布局:

@Composable
fun MyLayout() {
   Column(Modifier.padding(16.dp)) {
      Text("First Textbox")
      TextField(value = "", onValueChange = {})
      Text("Second Textbox")
      TextField(value = "", onValueChange = {})
   }
}

在这个例子中,我们使用了 Column 和 TextField 等 Composable 函数,它们是通过 Compose 库提供的。这个 Column 函数创建了一个垂直的布局,并指定了 padding 修饰符来给子视图留出一些空间。 TextField 函数则创建了一个文本输入框,并通过 value 和 onValueChange 属性指定了对应的值和事件句柄。

通过这种方式,我们可以使用 Composable 函数来创建任意复杂的布局和 UI 元素,例如列表、网格、图片等等。并且在 Composable 函数内部,我们也可以使用 Kotlin 语言提供的所有功能和结构,例如循环、条件语句等等,来处理数据和控制 UI 行为。

使用这种方式声明 UI 布局,可以让设计师和开发者更好地协作,因为他们可以将布局和 UI 控件作为代码组件来共享和重用,而无需过多地关注底层的实现细节。同时,这种方式也可以让开发者更加灵活地控制 UI 元素,并快速响应用户的需求和变化。

全文主要讲解一了Android开发中的前沿技术; Jetpack Compose布局,关于Compose还有很多需要深入学习;进阶学习可参考《Android核心技术手册》这个文档,里面记录了30个大大小小的技术板块。查看详情类目获取哦!

总结

以上是 Jetpack Compose 中的一些常用标准布局组件。Row 和 Column 可用于排列在水平和垂直方向上的子组件;Box 可用于包含和定位子组件;ConstraintLayout 可用于使用约束布局子组件;ScrollView 可用于将子组件放置在可滚动的视图中;LazyColumn 和 LazyRow 可以仅生成在视图中可见的部分子组件;Spacer 可用于向子组件添加空间。

使用这些标准布局组件和 Composable 函数可以轻松地实现 UI 布局。Composable 函数提供了一种构建 UI 逻辑的方式,而组件提供了常见的布局和交互模式。通过组合这些组件和函数,可以构建出复杂的 UI,同时保证代码的可读性和可维护性。

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

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

相关文章

Windows使用Dockers+battery historian踩坑记

1、首先,需要翻墙。 2、然后安装Dockers,网上好多博客说安装Docker Toolbox,我亲测无效,卸载后安装Docker for Windows,安装完成后打开,会提示: Hardware assisted virtualization and data e…

Promise这样理解更简单

一、Promise小白怎么用?从一个故事开始吧 1、先来一段废话故事 您是一名在古老迷失城市中探险的冒险家。您身处一间装饰华丽的房间中,四周布满了古老的壁画和雕塑。您发现有两个通道分别通向不同的方向,分别是:一个黑暗的通道和…

Hive源码阅读环境准备

源码地址 hive源码地址在github或gitee均可以下载,如果没有vpn工具,使用gitee网速更快点。 github地址为: https://github.com:edingbrugh/hive.gitgitee地址如下: https://gitee.com/apache/hive.git环境要求 本地或远程已经安装hivejdk 8maven 3.6…

高权限注入跨库注入

简介 上篇文章中我们讲述了如何进行手工注入,也通过墨者学院的靶场,真实的感受了SQL注入的感觉。这篇文章我们将继续介绍SQL注入。 高权限注入 含义 世界上有千千万万的网站,我们也都知道网站需要部署在服务器上,但是如果一台…

C++基础知识-----命名空间

本期开始我们来对C进行学习 目录 1.C关键字 2.命名空间 3.C的输入与输出 1.C关键字 C总计63个关键字,C语言32个关键字 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcase…

摘得重磅奖项,发表精彩演讲,深度参编报告!美创闪耀CSA GCR大会

4月13日,第六届云安全联盟大中华区大会在上海举办,大会由联合国数字安全联盟、上海市经济和信息化委员会、上海市委网络安全和信息化委员会办公室、上海市普陀区人民政府指导,云安全联盟大中华区主办。 作为零信任数据安全践行者,…

java银行ATM机模拟系统dzkf94

目录 摘要 I Abstract II 第1章 绪论 1 1.1 ATM简介 1 1.2 ATM发展 1 1.3 开发意义 1 1.4 论文的组成 1 1.5 本章小结 2 第2章 系统分析 3 2.1 功能需求分析 3 2.2 业务流程分析 4 2.3 数据流程分析 5 2.4 本章小结 7 第3章 系统开发技…

车载网络 - Autosar网络管理 - 常用缩写

为了方便大家日常工作中的使用和交流,每块专业规范或者文章中,都会有或多或少的缩写使用,然而如果一段时间没使用,经常会忘记这些缩写到底代表的是什么意思,为了方便后续内容的介绍,也为了我自己后面忘记后…

【数据分析之道-NumPy(四)】numpy广播机制

文章目录 专栏导读1、广播机制2、一维数组和二维数组的广播3、二维数组和三维数组的广播4、标量和数组的广播5、形状不兼容的数组不能进行广播专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》,本专栏针对…

MySQL---数据类型

文章目录前言一、数据类型分类二、数值类型1.tinyint类型2.bit类型三、小数类型1.float2. decimal三、字符串类型1.char2.varchar3.char和varchar比较四、日期和时间类型五、enum和set我们如何找到性别是男或者女呢?我们如何找到爱好有rapper呢?总结前言 正文开始!!! 一、数…

MyBatis 批量插入的正确姿势

近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。 这个方法提升批量插入速度的原理是,将传统的: INSERT INTO `table1` (`field1`, `field2`) VALUES …

Linux服务器怎么关闭防火墙?

Linux服务器怎么关闭防火墙? 在很多情况下,防火墙都会组织一些端口号的通讯。 比如我们的tomcat,nginx,redis明明安装的没问题,但在外部就是访问不了,那很有可能就是防护墙的原因了。我是艾西,…

protobuf编码格式解析

示例 假如定义一个如下的protobuf类型 message Person {required string user_name 1;optional int64 favorite_number 2;repeated string interests 3; }将其赋值为: user_name : "Martin" favorite_number : 1337 interests:"daydrea…

pyLoad远程代码执行漏洞复现(CVE-2023-0297)

1、产品简介 pyLoad是一个用 Python 编写的免费和开源下载管理器,可用于NAS、下一代路由器、无头家庭服务器以及任何能够连接到互联网并支持 Python 编程语言的设备。 2、漏洞概述 pyLoad 存在代码注入漏洞,未经身份验证的攻击者可以通过滥用 js2py 功能…

c/c++:类型限定符,printf输出格式,putchar,scanf,getchar

c/c:类型限定符,printf输出格式,putchar,scanf,getchar 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&am…

结构方程模型(SEM)高阶应用系列

结构方程模型(Structural Equation Modeling)是分析多变量间因果关系的利器,在众多学科领域具有巨大应用潜力。我们前期推出的《基于R语言结构方程模型》通过结构方程原理介绍、结构方程全局和局域估计、模型构建和调整、潜变量分析、复合变量…

docker-compose安装prometheus告警系统

docker-compose安装Prometheus一、概述一、docker-compose二、配置文件一、概述 本文只有监控与告警的安装、告警发送、发送模版的配置。没有数据展示监控数据UI工具 一、docker-compose 1)docker-compose.yaml version: 3.0 services:#1.prometheusprometheus:…

springcloud学习总结

springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址:https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址:https://www.…

【Linux-MYSQL】数据库的使用

目录 1.数据库介绍 🌈1.1数据库的分类 🌈1.2存储引擎 2.数据库的操作 🌈2.1创建数据库 ​编辑👿 1.查show databases; 👿2删除 drop database库名 👿3.创建 create 查看创建数据库的详细信息 &…

朝花夕拾 - 卷王的自白(光头祭天,法力无边》

一、震撼开场 做一个卷王 ta 有什么错,无非就是 ——「秃」了那么一点点!!!咳咳咳,一一回复:自愿的没有想不开没有考到寺庙心态正常……如果非要给这次的行为贯穿一个理由,那就是「下周四就 28 …