Compose入门

​ 本篇文章主要是为了对Compose有一个初步了解。知道Compose是做什么的,用Compose能干什么,在目前的各种UI框架下面有些优势,参考Google官网的解释加上一些自己的理解生成的一篇文章。本人也是Compose初学者,通过每一步学习遇到哪些坑,来一起探讨Compose的学习使用。 后续会根据Compose学习,从简单布局、控件使用到各种高级动画的渲染,再到实现原理,不断输出Compose相关的系列文章。带你一起从初步认知Compose到撸出一个使用Compose完成的安卓APP。

目前google已经把compose作为默认的UI开发框架,无论是多年开发经验的安卓老司机,还是刚入门的安卓开发人员,学习使用compose已经是大势所趋。多学习一项技能对自己没什么坏处。自从2017年Compose被提出到2021年7月 Jetpack Compose 1.0 正式版发布,已经有很长时间,已经满足我们的基本开发需求,而且还在继续完善中。

一、什么是Compose

**官方解释:**Jetpack Compose是用于构建原生Android界面的新款工具包。它可简化并加快Android上的界面开发,使用更少的代码、强大的工具和直观的Kotlin API,快速打造生动而精彩的应用。

**个人理解:**为了解决安卓原始xml构建UI的弊端,对照IOS的swift、Web的Vue等声明式编程的产物。

二、为什么使用Compose
1、更少的代码:实现相同的功能,使用compose代码量更少

使用更少的代码实现更多的功能,并且可以避免各种Bug,从而使代码简洁且易维护。

2、直观

您只需要描述界面,Compose会负责处理剩余的工作。应用状态变化时,界面会自动更新。

3、加速开发

兼容现有的所有代码,方便您随时随地采用。借助实时预览和全面的Android Studio支持,实现快速迭代。

4、功能强大

直接访问Android平台API,内置对Material Design,深色主题、动画等支持,帮助您创建精美的应用。

三、Compose入门

这里将通过一个简单的登录页面,展示Compose的使用。首先看一下下图。一个登录界面,包括标题,输入账号、输入密码、登录按钮,点击登录即可拿到输入的账号密码,然后进行调取接口登录。这里使用toast展示用户输入的内容,真是项目可以直接去调用服务器接口了。

在这里插入图片描述

下面分析一下登录界面的代码,展示Compose的基本使用。

class LoginComposeUI : ComponentActivity() {companion object {fun startActivity(context: Context) {val intent = Intent(context, LoginComposeUI::class.java)context.startActivity(intent)}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {LoginLayoutCompose()}}@OptIn(ExperimentalMaterial3Api::class)@Composablefun LoginLayoutCompose() {Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {Text(text = "Login",modifier = Modifier.height(44.dp).background(Color(0xFFef5a54)).fillMaxWidth().wrapContentSize(Alignment.Center).align(Alignment.TopCenter),color = Color(0xffffffff))var userNameText by remember {mutableStateOf("")}var passwordText by remember {mutableStateOf("")}Column(modifier = Modifier.fillMaxWidth().padding(0.dp, 100.dp, 0.dp, 0.dp)) {OutlinedTextField(value = userNameText,onValueChange = {userNameText = it},modifier = Modifier.padding(20.dp, 20.dp, 20.dp, 0.dp).fillMaxWidth(),placeholder = { Text(text = "请输入账号") })OutlinedTextField(value = passwordText,onValueChange = {passwordText = it},modifier = Modifier.padding(20.dp, 20.dp, 20.dp, 0.dp).fillMaxWidth(),placeholder = { Text(text = "请输入密码") })Divider(modifier = Modifier.height(30.dp), color = Color(0xffffffff))Button(onClick = {val tips = "账号:$userNameText  密码:$passwordText 登录了"ToastUtil.toastShort(AppUtils.getContext(), tips)},modifier = Modifier.height(80.dp).fillMaxWidth().wrapContentSize(Alignment.TopCenter)) {Text(text = "Login", modifier = Modifier.wrapContentSize(Alignment.Center))}}}}}

首先这里没有原来安卓的xml文件,直接写的Compose布局来定义UI界面

1、设置Activity的Content

原来的setContent一般是通过设置view或者设置View的xml布局来实现,然后通过FindviewById方式拿到View实例

setContentView(view)

看上面的代码,Compse实现的UI直接设置给setContent即可,无需在使用Xml定义布局

 setContent {LoginLayoutCompose()}
2、可组合函数

给LoginLayoutCompose设置@Composable注解,代表此方法是可组合函数,可以被其他可以组合函数调用。

3、熟悉Compose中简单的布局

​ LoginLayoutCompose函数中第一个就box函数布局,设置 modifier中fillMaxWidth和fillMaxHeight表示匹配父窗体,撑满整个屏幕。

modifier = Modifier.fillMaxWidth().fillMaxHeight()

里面首先是顶部的Login标题部分Text函数,可以设置标题内容,字体颜色、字体大小、背景颜色。

Text(text = "Login",modifier = Modifier.height(44.dp).background(Color(0xFFef5a54)).fillMaxWidth().wrapContentSize(Alignment.Center).align(Alignment.TopCenter),color = Color(0xffffffff)
)

接下来是Column布局函数,设置padding表示距离顶部100dp。宽度匹配父窗体。该布局户主要是竖向一个一个排列布局中的组合函数。类似LinearLayout设置成 android:orientation=“vertical” 的效果。

Column(modifier = Modifier.fillMaxWidth().padding(0.dp, 100.dp, 0.dp, 0.dp)
)

Column布局中,通过OutlinedTextField函数添加二个输入框,输入账号和密码,其中value设置初始值,onValueChange在输入框变化时候回调赋值给userNameText,modifier可以设置输入框一些属性;placeholder设置没有输入时候占位置展示内容。这几个属性是OutlinedTextField函数的基本使用。

OutlinedTextField(value = userNameText,onValueChange = {userNameText = it},modifier = Modifier.padding(20.dp, 20.dp, 20.dp, 0.dp).fillMaxWidth(),placeholder = { Text(text = "请输入账号") })

可组合函数Button是界面中login按钮的UI布局,在Column函数布局中以此排列。onClick方法在用户点击按钮时候回调。

Button(onClick = {val tips = "账号:$userNameText  密码:$passwordText 登录了"ToastUtil.toastShort(AppUtils.getContext(), tips)},modifier = Modifier.height(80.dp).fillMaxWidth().wrapContentSize(Alignment.TopCenter)) {Text(text = "Login", modifier = Modifier.wrapContentSize(Alignment.Center))
}

每个可组合函数中都有modifier参数供可组合函数设置,里面主要包括布局的一些基本属性,这里只是简单的描述一下,暂时知道他是干什么的就可以,后边章节将会重点描述modifier怎么使用,里面的每个属性是用来什么的。modifier也是compose中重要组成部分,所有的可组合函数都包括这个属性。

​ 本章到这里基本结束了,主要介绍Compose是什么,为什么使用Compose,Compose入门使用基本。后边章节将会介绍Compose中各种布局的使用。以后深入了解Compose各种组件,在开发Compose中遇到的问题一些来分享,感觉您的阅读,希望提出您宝贵的意见。

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

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

相关文章

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃,语雀崩完淘宝崩,淘宝崩完滴滴崩,随着业务的发展和技术的进步,对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求,提高系统的稳定性和扩展性至关重要。…

网络入门---网络的大致了解

目录标题 网络发展的简单认识协议作用的理解协议的本质什么是协议分层网络通信所面对的问题OSI七层模型TCP/IP模型协议报头的理解局域网通信局域网通信基本原理报头的问题局域网的特点跨网的网络链接如何查看mac地址 网络发展的简单认识 通过之前的学习我们知道计算机是给人提…

【深度学习】基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率,图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题,在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

创建Asp.net MVC项目实现视图页面数据传值显示

MVC中视图传值 ViewData ViewBag TempData 举例创建三中传值方式实现页面数据展示 MVC中视图传值 Asp.net MVC中Controller向View传值有多种方式,这里简单说一下其中3种方式 ViewData、ViewBag和TempData ViewData ViewData存储数据,ViewData的声明和赋值方…

扫地机器人市场持续火爆,景联文科技数据采集标注方案助力扫地机器人智能化升级

随着消费者对智能家居和清洁卫生的需求增加,扫地机器人市场规模不断扩大。市场竞争也日益激烈,各品牌都在努力提升产品性能和服务质量,以获取更大的市场份额。 IDC的统计数据显示,今年双十一前两周(2023年10月23日至20…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券,文末可领取 。 事情发生于 2023年11月27日晚~28日中午,滴滴打车服务出现大面积故障,登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题,导致大量用户滞留在外,出行受阻…

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

BUUCTF-pwn-ciscn_2019_ne_51

简单查看保护: 32为程序没有canary没有PIE,应该是简单的栈溢出。我们照着这个思路去找溢出点在哪,运行下程序看看什么情况: 程序上来是输入一个密码验证。随便输入下错误直接退出。因此我们需要到IDA中看看怎么回事: 主…

python -- python安装

1、python的诞生和发展: python语言是一种解释型、面向对象型、动态数据类型的高级程序设计语言。 2、python的安装: 1、安装解析器: 在安装的过程中需要注意的是: 在安装pycharm的时候也是同样的道理,需要指定安装…

【数据结构】——解决topk问题

前言:我们前面已经学习了小堆并且也实现了小堆,那么我们如果要从多个数据里选出最大的几个数据该怎么办呢,这节课我们就来解决这个问题。我们就用建小堆的方法来解决。 首先我们来看到这个方法的时间复杂度,我们先取前k个数据建立…

Egg.js中Cookie和Session

Cookie HTTP请求是无状态的,但是在开发时,有些情况是需要知道请求的人是谁的。为了解决这个问题,HTTP协议设计了一个特殊的请求头:Cookie。服务端可以通过响应头(set-cookie)将少量数据响应给客户端&#…

解决msvcr71.dll丢失5个方法,修复程序运行缺失dll问题

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcr71.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时,给使用者带来了很大的困扰。那么,究竟是什么原因导致了msvcr71.dll文件的丢失呢?本文…

Vue3-目录调整

默认生成的目录结构不满足我们的开发需求,所以这里需要做一些自定义改动。 主要是以下工作: 1.删除一些初始化的默认文件 2.修改剩余代码内容 3.新增调整我们需要的目录结构 在src文件夹下创建两个新文件夹,一个叫api(请求模…

Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)

目录 一、前言 二、Spring快速入门 1.简介 : 2. 入门实例 : 三、Spring容器结构分析 1.bean配置信息的存储 : 2.bean对象的存储 : 3.bean-id的快捷访问 : 四、总结 一、前言 开门见山,11.25日开始我们正式进入Java框架—Spring的学习,此前&…

基于springboot+vue的在线考试系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Drool 7 SpreadSheet Decision Template 笔记

1 Excel Decision table 1.1 很棒的示意图,来自https://blog.csdn.net/justlpf/article/details/128109731 1.2 参考URL 1.2.1 https://blog.csdn.net/justlpf/article/details/128109731 1.3 多sheet 模式 默认是用第一个sheet如果要支持多sheet,需…

JavaScript包装类型

前端面试大全JavaScript包装类型 🌟经典真题 🌟包装类型 🌟真题解答 🌟总结 🌟经典真题 是否了解 JavaScript 中的包装类型? 🌟包装类型 在 ES 中,数据的分类分为基本数据类型…

初识向量数据库

背景 现在的数据分为20%的传统结构化数据,80%的非结构化数据 结构化数据:主要单元是数值与符号,数据类型高度抽象且易于组织。基于数值运算与关系代数,可以轻松地对结构化数据进行分析。 非结构化数据:常见的类型包括…

vue3 uniapp h5 安卓和iOS开发适配踩坑记录

font-size适配屏幕大小及iOS和安卓状态栏及安全距离的处理 App.vue <script setup lang"ts"> import { onLaunch, onShow, onHide } from "dcloudio/uni-app"; import ./main.scss onLaunch(() > {console.log("App Launch");var wid…

SQL注入-数据库基础/SQL语法

目录 一&#xff0c;数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二&#xff0c;SQL 语法基础 三&#xff0c;SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四&#xff0c;基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五&#xff0c;目录数据库info…