Jetpack Compose 远不止是一个UI框架这么简单~

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)

    image.png

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

最后

小编在网上收集了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,希望能帮助到大家学习提升,如有想参考小编 PDF学习文档的如果有需要的可以 私信回复我 666 即可货取!!!里面记录许多Android 相关学习知识点。

原文地址:https://blog.csdn.net/weixin_61845324

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


更新Android SDK到3.0版本时,遇到Failed to rename directory E:\android\tools to E:\android\temp\ToolPackage.old01问题,导致无法更新,出现该问题的原因是由于3.0版本与较早的sdk版本之间文件结构有冲突,解决
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件: 1)重写onKeyDown或者onKeyUp方法 2)重写onBackPressed方
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawable
Android中的"Unable to start activity ComponentInfo"的错误 最近在做一款音乐播放器的时候,然后在调试的过程中发现一直报这个错误"Unable to start activity ComponentInfo",从字面
Android 关于长按back键退出应用程序的实现最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面
android自带的时间选择器只能精确到分,但是对于某些应用要求选择的时间精确到秒级,此时只有自定义去实现这样的时间选择器了。下面介绍一个可以精确到秒级的时间选择器。 先上效果图: 下面是工程目录: 这个控件我也是用的别人的,好像是一个老外写的,com.wheel中的WheelView是滑动控件的主
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按
如何向Android模拟器中导入含有中文名称的文件在进行Android开发的时候,如果需要向Android模拟器中导入文件进行测试,通过DDMS下手动导入或者在命令行下通过adb push命令是无法导入含有中文文件名的文件的。后来发现借用其他工具可以向模拟器中导入中文名称的文件,这个工具就是Ultr
Windows 下搭建Android开发环境一.下载并安装JDK版本要求JDK1.6+,下载JDK成功后进行安装,安装好后进行环境变量的配置【我的电脑】-——>【属性】——>【高级】 ——>【环境变量】——>【系统变量】中点击【新建】:变量名:CLASSPATH变量值:……
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹出菜单,此时可以考虑用PopupWindow来实现。下面就来介绍一下如何使用PopupWindow实现一个弹出窗。 主Activity代码:public void onCreat
解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾了很久没有解决。最后在google上找到了大家给出的两种解决方案,下面给出这两种方法的链接博客:ht
AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout ="http://schemas..._android studio 界面跳转
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件来用,然后发现了这两款神作,都是外国的软件,而且都是开源的软件,因此把源码下载了下来,给有需要研究代理这方面的童鞋看看。不得不说,国外的开源精神十分浓,大家相互使用当前基础的开源软件,然后组合成一个更大更强的大开源软件。好吧,废话不多说,下面简单介绍一下这两款开源项目。一、ProxyDroid:ProxyDroid功能比较强大,用到的技术也比较多,源码也_proxydroid
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项目时Gradle Build 窗口却显示错误:程序包R不存在通常情况下是不会出现这个错误的。我是怎么遇到这个错误的呢?第一次创建项目,company Domain我使用的是:aven.com,但是创建过程在卡在了Building 'Calculator' Gradle Project info这个过程中,于是我选择了“Cancel”第二次创建项目,我还是使用相同的项目名称和项目路_r不存在
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下:一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。二、对ProxyDroid进行配置(基本配置:) (1) Auto S_proxydroid使用教程
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供了一个很实用的工具Android设备监视器(Android device monitor),该监视器中最常用的一个工具就是DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务。可以进行的操作有:为测试设备截屏,查看特定进程中正在运行的线程以及堆栈信息、Logcat、广播状态信息、模拟电话_安卓摄像头调试工具