Jetpack Compose 不止是一个UI框架~

2023-05-16

Jetpack Compose是用于构建原生Android UI的现代工具包。 Jetpack Compose使用更少的代码,强大的工具和直观的Kotlin API,简化并加速了Android上的UI开发。这是Android Developers 官网对它的描述。

本文不是教你Jetpack Compose 的一些基本使用方法,而是为啥我们需要Jetpack Compose 的一些简洁,让我们对Jetpack Compose 有更深层次的了解。

1. 为什么我们需要一个新的UI 工具?

在Android中,UI工具包的历史可追溯到至少10年前。自那时以来,情况发生了很大变化,例如我们使用的设备,用户的期望,以及开发人员对他们所使用的开发工具和语言的期望。

以上只是我们需要新UI工具的一个原因,另外一个重要的原因是View.java这个类实在是太大了,有太多的代码,它大到你甚至无法在Githubs上查看该文件,因为它实际上包含了30000行代码,这很疯狂,而我们所使用的几乎每一个Android UI 组件都需要继承于View。

GogleAndroid团队的Anna-Chiara表示,他们对已经实现的一些API感到遗憾,因为他们也无法在不破坏功能的情况下收回、修复或扩展这些API,因此现在是一个崭新起点的好时机。

这就是为什么Jetpack Compose 让我们看到了曙光。

2. Jetpack Compose的着重点

包括一下几个方面:

  • 加速开发
  • 强大的UI工具
  • 直观的Kotlin API
2.1 加速开发

如果你是一个初级开发工程师,你总是希望有更多的时间来写业务逻辑,而不是花时间在一些如:动画、颜色变化等事情上,看看下面这个View:

这个Material Edit-text 似乎看起来很简单,但是其实背后有许多东西需要关注,比如:动画、颜色改变、状态管理等等。

而Jetpack Compose 为我们提供了很多开箱即用的Material 组件,如果的APP是使用的material设计的话,那么使用Jetpack Compose 能让你节省不少精力。

2.2 强大的UI工具

没有正确工具的UI工具包是无用的,因此从过去10年的经验中能学到不少,Jetpack Compose 团队开始和JetBrains 合作,以提供开发者强大的工具包,在Android Studio 上大规模的支持Compose 能力。

看一看在Android Studio上的表现:

上图是使用Jetpack Compose 开发UI时,在Android Studio 上的预览,你可以看到,在左边编码时,右边你能同时展现UI即时预览,比如在明/暗模式下的状态切换,都能在右边及时展示出来。

它与我们现在使用的Android Studio 中的text/Design 相似,但是它更加先进,使用很简单,这个功能只能在Android Studio4.0以上预览版,开发compose 时使用。

2.3 直观的Kotlin API

对于开发者而言,Jetpack Compose 的用途不仅仅是Android UI,因此用Kotlin来编写他们并开源。当然,所有Android代码都是开源的,但特别强调的是Compose代码。因此,您可以查看和使用代码,同时也可以在此处提供反馈。

由于Compose仍在开发之中,因此每个开发人员的反馈都很重要。

3. API 设计

十多年来,Android团队在创建API和审查API方面拥有丰富的经验,但有一个收获-他们使用Java作为编程语言。但有一个问题-他们使用的是Java作为开发语言。

Jetpack Compose是第一个使用Kotlin正在开发中的大型项目,因此Android团队正在探索Kotlin API指南的新世界,以创建一组特定于Compose API的指南,该工作仍在进行中,仍然有很长的路要走。

4. Compose API 的原则

4.1 一切都是函数

正如我前面的文章所说,Compose是一个声明式UI系统,其中,我们用一组函数来声明UI,并且一个Compose函数可以嵌套另一个Compose函数,并以树的结构来构造所需要的UI。

在Compose中,我们称该树为UI 图,当UI需要改变的时候会刷新此UI图,比如Compose函数中有if语句,那么Kotlin编译器就需要注意了。

4.2 顶层函数(Top-level function)

在Compose的世界中,没有类的概念,全都是函数,并且都是顶层函数,因此不会有任何继承和层次机构问题。

@Composable
fun checkbox ( ... )

@Composable
fun TextView ( ... )

@Composable
fun Edittext ( ... )

@Composable
fun Image ( ... )

在此过程中,Compose函数始终根据接收到的输入生成相同的UI,因此,放弃类结构不会有任何害处。从类结构构建UI过渡到顶层函数构建UI对开发者和Android 团队都是一个巨大的转变,顶层函数还在讨论之中,还没有发布release 版。

4.3 组合优于继承

Jetpack Compose首选组合而不是继承。 Compose会基于其他部分构建UI,但不会继承行为。

如果你经常关注Android或者对Android有所了解,你就会知道,Android中的几乎所有组件都继承于View类(直接或间接继承)。比如EidtText 继承于TextView,而同时TextView又继承于其他一些View,这样的继承机构最终会指向跟View即View.java。并且View.java又非常多的功能。

而Compose团队则将整个系统从继承转移到了顶层函数。TextviewEditText复选框和所有UI组件都是它们自己的Compose函数,而它们构成了要创建UI的其他函数,代替了从另一个类继承。

4.4. 信任单一来源

信任单一来源是构建整个Jetpack Compose 一项非常重要的特性。如果您习惯了现有的UI工具包,那么您可能会知道执行点击的工作原理。如下代码所示:

@Override
public boolean performClick(){
  setChecked(!mChecked);
  final boolean handled = super.performClick();
  ...
}

首先,它改变view的状态,然后执行动作,这会导致许多bug,例如复选框,因为它首先从已选中状态变为未选中,反之亦然,然后由于某种原因,如果操作失败,开发人员必须手动分配先前的状态。

而在Compose中呢,功能正好相反。在此,复选框等功能具有两个参数。一个是在UI中显示状态,另一个是lambda函数,用于观察UI应相应更改的状态变化。

@Composable
fun Checkbox(checked : Boolean,
            onCheckedChange : ((Boolean) -> Unit)),
            ....)

5. 深入了解Compose

如上图所示,Compose在运行时分为四个部分。让我们一一看一下。

5.1 Core

顾名思义,这是Compose的核心,如果您不想深入学习,可以跳过它。

基本上,核心包含四个构建模块:

  • 绘制(Draw)
  • 布局(Layout)
  • 输入(Input)
  • 语义(Semantics)

1、Draw — Draw 给了你访问Canvas的能力,因此你可以绘制你要的任何自定义View
2、Layout — 通过布局,我们可以测量事物并相应地放置视图。
3、Input — 开发人员可以通过输入访问事件并执行手势
4、Semantics — 我们可以提供有关树的语义信息。

5.2. Foundation

Foundation的核心是收集上面提到的所有内容,并共同创建一个抽象层,以使开发人员更轻松调用。

5.3 Material

在这一层,所有的Material组件将会被提供,并且我们可以通过提供的这些组件来构建复杂的UI。

这是Compose团队所做的出色工作中最精彩的部分,在这里,所有提供的View都有Material支持,因此,使用Compose来构建APP, 默认就Material风格的,这使得开发者少了很多工作。

6. 插槽API

插槽API的出现是为了给开发人员留出了很多空间,以便他们可以执行所需的任何自定义操作,Android团队试图猜测开发人员可能会想到的许多自定义设置,但他们无法一直想象开发人员的想法,例如使用带drawable的TextView。

因此,Compose团队为组件留出了空间,以便开发人员可以执行所需的任何操作,例如使用按钮。你可以保留文本带有图标的文本所需的任何内容,如下所示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose 不止是一个UI框架~ 的相关文章

  • docker-compose搭建lnmp环境

    使用命令创建文件和文件夹 span class token function mkdir span p span class token punctuation span php nginx span class token punctua
  • Docker Compose部署Springboot+Mysql项目

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 在上一篇文章Spring Boot Maven 43 Docker打包中 xff0c 我们实现了将Springboot项目源代码一
  • JETSON TX2镜像备份与恢复以及刷机的巨详细教程(Jetpack 4.4版本)

    摘自 xff1a https blog csdn net Feizhai2 article details 109068697 utm medium 61 distribute pc relevant t0 none task blog B
  • NVIDIA Jetson TX2 Jetpack 4.5.1 刷机 要点总结

    参考 xff1a Jetson TX2刷机Jetpack4 2 亲测成功版 linkJetson tx2 使用 jetpack 4 3刷机全过程link 注意 连接 TX2 和 host 电脑 usb c 线一定是信号线 xff0c 用信号
  • Docker Compose

    1 简介 Docker Compose 项目是 Docker 官方的开源项目 xff0c 负责实现对Docker容器集群的快速编排 Docker Compose将所管理的容器分为三层 xff1a 工程 xff08 project xff09
  • 使用docker-compose配置mysql数据库并且配置用户密码

    下面要求环境 xff1a 一定要安装docker ce和docker compose才能进行下面步骤 linux找到你要放mysql的目录 创建一个docker compose yml 以下配置了外部数据卷 外部配置文件 外部初始化文件 x
  • SEATAdocker-compose部署

    docker compose 文件 span class token key atrule version span span class token punctuation span span class token string 39
  • Jetpack Compose 不止是一个UI框架~

    Jetpack Compose是用于构建原生Android UI的现代工具包 Jetpack Compose使用更少的代码 xff0c 强大的工具和直观的Kotlin API xff0c 简化并加速了Android上的UI开发 这是Andr
  • Docker Compose

    1 Docker Compose官网说明 理解 Compose是Docker官方的开源项目 需要安装 xff01 Dockerfile 让程序在任何地方运行 web服务 redis mysql nginx 多个容器 run Compose的
  • JetsonTX2 之刷机 ——Jetpack 4.3

    2020年再次使用Nvidia Jetson tx2 xff0c Jetpack已经发行了4 4 xff0c TX2默认的系统也升级到了ubuntu 18 04 xff0c 刷机方式也发生了变化 这里记录我的刷机过程 xff0c 亲测有效
  • TX2安装jetpack

    目前官网支持的下载为JetPack L4T 3 2 1 linux x64 b23和JetPack L4T 3 3 linux x64 b39 首先使用具有Ubuntu16 04的host主机 xff08 我使用的是个人笔记本 xff0c
  • Jetpack练手(03):DataBinding

    文章目录 一 导入依赖二 搭建布局三 创建 ViewModel 数据对象四 修改布局为 DataBinding 布局五 绑定数据六 Demo 效果 一 导入依赖 新建 DataBindingDemo 工程 xff0c 参照 LiveData
  • Jetpack练手(04):Lifecycle

    文章目录 一 搭建布局二 非 Lifecycle 实现三 Lifecycle 实现四 Demo 效果 一 搭建布局 新建 LifecycleDemo 工程实现 界面停留时间计时 xff0c 在 activity main xml 搭建简单布
  • docker-compose 中 volumes、environment、privileged、network_mode的使用

    privileged xff1a 用来给容器root权限 xff0c 不安全的environment xff1a 设置容器中的环境变量volumes xff1a 用来存储docker持久化的数据 xff0c 启动tomcat容器后 xff0
  • Jetpack学习之Navigation

    Jetpack提供了一个名为Navigation的组件 用来管理页面 Actvity和Fragment 以Fragment为主 和App bar Navigation的优势 可视化的页面导航图 便于理清页面间的关系 通过destinatio
  • 不贴代码能说明白Jetpack LiveData原理吗(一)

    LifecycleOwner如何提供周期生命周期的变化 LifecycleObserver如何得知生命周期的变化 LiveData的背后隐藏了多少不为人知的秘密 这一切都要从观察者模式说起 起源 何为观察者模式 在代码中最直接的表现就是在事
  • Jetpack学习之Room

    Android采用sqlite作为数据库存储 Room就是Google推出的自己的ORM Object Relational Mapping Room的架构图 Entity 一个Entity对应于数据库中的一张表 Entity类是Sqlit
  • Github上 简单易用的 Android ViewModel Retrofit框架

    RequestViewModel 长期更新 支持网络请求的ViewMode框架 ViewModel LiveData Retrofit github 地址 https github com miaotaoii RequestViewMode
  • Navigation Preview unavailable in Android Studio 3.4 Preview

    Navigation Preview unavailable in Android Studio 3 4 Preview 最近在学Jetpack Navigation组件 但是在写navigation资源文件的时候 Preview 显示不出
  • Android Jetpack 之 DataStore

    1 概述 Google 推出了 JetPack 的新成员 DataStore DataStore 是一种新的数据存储方案 DataStore 以异步 一致的事务方式存储数据 克服了 SharedPreferences 的一些缺点 Jetpa

随机推荐

  • c++的好处

    1 更新迭代慢 xff0c 技术成熟的很高 xff0c 基本不会有太大的改动 xff0c 工作后学习压力小 2 C C 43 43 是系统编程层级唯一的一门高级语言 xff0c 速度快 xff0c 效率高 不用担心今后会被取代 3 C C
  • lacp协议

    LACP xff08 Link Aggregation Control Protocol xff0c 链路聚合控制协议 xff09 将多条链路逻辑上模拟成一条链路 xff0c 以增加网络带宽 xff08 通常网络多条链路情况下 xff0c
  • Windows 10 下安装Linux

    使用Hype V 快速安装 选择的Ubuntu 22 04 LTS 安装一切正常 xff0c 登录提示 登录以后提示connecting to sesman ip 127 0 0 1 port 3350 关闭查看菜单的 增强模式 xff0c
  • mvvm是什么?

    1 总结 一句话总结 xff1a vm层 xff08 视图模型层 xff09 通过接口从后台m层 xff08 model层 xff09 请求数据 xff0c vm层继而和v view层 实现数据的双向绑定 2 mvc和mvvm的关系 xff
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • ubuntu 16.04版本安装docker以及创建docker容器

    一 简介 Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 容器是完全使用沙箱机制 xff0c
  • 字符串操作函数strstr

    目录 一 strstr函数介绍 二 strstr函数的模拟 三 代码实现 一 strstr函数介绍 在编写程序的过程中 xff0c 我们不可避免地会调用字符串操作函数 xff0c 今天要介绍的字符串操作函数是strstr函数 strstr函
  • 【无标题】前端工程师面试题手册-有点长但是很有用

    不是原作者 想想要获取更多前端开发相关学习资料 xff0c 请加微信1124692领取 前端工程师面试题手册 目录 1 前端基础 11 1 1 HTTP HTML 浏览器
  • 超详细的VMware虚拟机安装Linux图文教程保姆级

    目录 一 下载VMware 二 安装VMware 三 下载Linux 四 安装Linux 五 设置本地机与虚拟机之间的数据传输 xff08 复制 粘贴等操作 xff09 一 下载VMware VMware官网有两个版本 xff0c 分别是
  • 仿牛客技术博客项目常见问题及解答(三)

    书接上回 xff1a 仿牛客技术博客项目常见问题及解答 xff08 二 xff09 李孛欢的博客 CSDN博客 13 项目中的kafka是怎么用的 xff1f kafka入门 Apache Kafka是一个分布式流平台 一个分布式的流平台应
  • [Java] 继承 和 多态(学习总结)

    目录 继承 一 继承主要表示概念层上的 is a 的关系 二 什么是继承 三 语法 四 继承方式 xff1a 五 访问权限 六 构造方法 七 父类的属性和方法的访问 八 重载和重写 xff08 前提是子类是有权限的 xff09 九 执行顺序
  • 第七章-X86汇编语言从实模式到保护模式

    第七章 比高斯更快的计算 7 3 显示字符串 39 1 43 2 43 3 43 43 100 61 39 字符串编译阶段 xff0c 编译器将把它们拆开 xff0c 形成一个个单独的字节jump near start跳过没有指令的数据区1
  • 【java】杂七杂八的基础知识

    1 当用javac命令编译Java源程序 xff08 java文件 xff09 时 xff0c 必须写出该源文件的完整文件名 xff0c 包括扩展名 java 2 当用java exe命令运行一个字节码 class 文件时 xff0c 不必
  • 论文笔记 Pruning neural networks without any databy iteratively conserving synaptic flow

    摘要 修剪神经网络的参数可以在训练和测试期间节省时间 内存和能量 最近的研究发现 xff0c 通过一系列昂贵的训练和修剪周期 xff0c 初始化时存在中奖彩票或稀疏可训练的子网络 这就提出一个基本问题 xff1a 我们能否在初始化时识别出高
  • 常见通信协议-原理篇

    目录 前言通信协议分类1 串行与并行通信2 同步与异步通信3 串行通信数据传送方向常见通信方式分类不同分类协议需要额外处理的问题 各通信协议详解一 UART 通用异步收发器 1 接口连接方式2 帧格式波特率 二 IIC 集成电路总线 1 接
  • 树莓派安装ubuntu20.04、图形桌面、ROS笔记

    目录标题 1 安装ubuntu方式1 xff1a 树莓派镜像烧录器方式2 xff1a win32 Disk Imager 烧录软件 2 添加wifi方式一 network config文件方式二 50 cloud init yaml文件 x
  • Git 常用命令

    git 注 xff1a 在使用的任何的 git 命令前 xff0c 都要切换到 git 项目目录下 git init 初始化一个 git 仓库 git status 查看当前 git 仓库的状态 git add file 修改 file 文
  • 字符串查找函数strstr,strtok的详细介绍

    strstr 返回str2在str1中第一次出现的指针 xff0c 如果str2不是str1的一部分 xff0c 则返回空指针str1 xff08 简单来说就是在字符串里找子字符串 xff09 可以看到上图strstr函数找到子串后会把剩余
  • 实现Windows远程连接

    此方法不止局限于局域网内 xff0c 只要被控制端的电脑连接上了互联网 xff0c 那么在任意一个电脑上都可以连接 话不多说直接上干货 xff01 xff01 xff01 配置被控制端电脑 一 开启远程桌面访问功能 不是windwos专业版
  • Jetpack Compose 不止是一个UI框架~

    Jetpack Compose是用于构建原生Android UI的现代工具包 Jetpack Compose使用更少的代码 xff0c 强大的工具和直观的Kotlin API xff0c 简化并加速了Android上的UI开发 这是Andr