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.mzph.cn/news/169805.shtml

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

相关文章

【Qt之QFileInfo】使用

描述 QFileInfo类提供了与系统无关的文件信息。 QFileInfo提供有关文件的名称和位置(路径)在文件系统中的信息,以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo还可以用于获取关于Qt资源的信…

基于java技术的社区交易二手平台

基于java技术的社区交易二手平台的设计与实现 (一)开发背景 随着因特网的日益普及与发展,更多的人们开始通过因特网来寻求便利。但是,许多人都觉得网上商店里的东西不贵。所以,有些顾客宁愿去那些用二次定价建立起来的…

kafka精准一次、事务、幂等性

Kafka事务 消息中间件的消息保障的3个级别 At most once 至多一次。数据丢失。At last once 至少一次。数据冗余Exactly one 精准一次。好!!! 如何区分只要盯准提交位移、消费消息这两个动作的时机就可以了。 当:先消费消息、…

Java基准测试工具JMH的简介与使用

JMH是一套Java基准测试工具&#xff0c;用于对Java执行进行基准测试以及生成测试报告。平时应用于Java一些基础Api或者一些工具类这种离开网络因素的纯系统测试。 使用方式 maven引入&#xff1a; <dependency><groupId>org.openjdk.jmh</groupId><art…

2024北京理工大学计算机考研分析

24计算机考研|上岸指南 北京理工大学 计算机学院始建于1958年&#xff0c;是全国最早设立计算机专业的高校之一。2018年4月&#xff0c;计算机学院、软件学院、网络科学与技术研究院合并成立新的计算机学院。学院累计为国家培养各类人才15000余名。计算机科学学科ESI排名进入全…

Lombok新版超全面使用教程

一、Lombok介绍 Lombok是一个Java库&#xff0c;可以通过注解来简化Java类的编写&#xff0c;减少冗余的样板代码。它提供了一系列的注解&#xff0c;用于自动生成常见的代码&#xff0c;如getter和setter方法、构造函数、equals和hashCode方法、toString方法等。通过使用Lomb…

论文阅读——Prophet(cvpr2023)

一、Framework 这个模型分为两阶段&#xff1a;一是答案启发生成阶段&#xff08;answer heuristics generation stage&#xff09;&#xff0c;即在一个基于知识的VQA数据集上训练一个普通的VQA模型&#xff0c;产生两种类型的答案启发&#xff0c;答案候选列表和答案例子&am…

使用SpringBoot集成FastDFS

使用SpringBoot集成FastDFS 这篇文章我们介绍如何使用 Spring Boot 将文件上传到分布式文件系统 FastDFS 中。 1、FastDFS FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问 &#xff0…

vue2-006——使用脚手架搭建vue2项目+项目结构分析

一、创建项目&#xff1a;vue create 项目名 D:\EnyiWang\Documents\myStudy\vue>vue create vue_testVue CLI v5.0.8 ? Please pick a preset: Default ([Vue 2] babel, eslint)Vue CLI v5.0.8 ✨ Creating project in D:\EnyiWang\Documents\myStudy\vue\vue_test. &am…

设计测试用例的具体方法总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️白马沉河共歃誓&#xff0c;怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…

[环境配置]vscode免密ssh的设置流程

测试环境&#xff1a; windows 11 ubuntu16.04 vmware 第一步&#xff1a;生成密钥 cmd打开输入&#xff1a;ssh-keygen -t rsa 一路回车后可以在C:\Users\用户名\.ssh路径看到id_rsa.pub&#xff0c;我们打开这个文件&#xff0c;用记事本打开即可&#xff0c;然后复制里…

“不得了·放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开

“不得了放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开 为了更好地推动四川省健身健美运动的普及和发展&#xff0c;结合《四川全民健身实施计划》的现状&#xff0c;适应新时代健身私教服务产业的发展需求&#xff0c;由中国健美协会指导&#xff0c;四川省健美健美…

BUUCTF [MRCTF2020]Ez_bypass 1

题目环境&#xff1a;F12查看源代码 I put something in F12 for you include flag.php; $flagMRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}; if(isset($_GET[gg])&&isset($_GET[id])) { $id$_GET[id]; $gg$_GET[gg]; if (md5($id) md5($gg) && $id ! $gg) { …

鸿蒙 ark ui 网络请求 我不允许你不会

前言&#xff1a; 最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 11-24 16:26:22.005 25156-25156/com.example.httpsrequest E A0ff00/HTTPS: 请求状态 --> 200, %{pub…

串口虚拟化工具

串口虚拟工具(Configure Virtual Serial Port Driver v7.2) 可以虚拟化串口 串口成对添加&#xff0c;添加之后可以在设备管理器中查看 链接&#xff1a;https://pan.baidu.com/s/1WE9c28MEoSEY7fGhy4kjag 提取码&#xff1a;yahn DebugTool-v.16 作用&#xff1a;可以检验…

区块链技术将如何影响未来的数字营销?

你是否听腻了区块链和数字营销等流行语&#xff0c;却不明白它们对未来意味着什么&#xff1f;那么&#xff0c;准备好系好安全带吧&#xff0c;因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率&#xff0c;其可能性是无限的。 让我们来探…

加速 Selenium 测试执行最佳实践

Selenium测试自动化的主要目的是加快测试过程。在大多数情况下&#xff0c;使用 Selenium 的自动化测试比手动测试执行得特别好。在实际自动化测试实践中&#xff0c;我们有很多方式可以加速Selenium用例的执行。 我们可以选择使用不同类型的等待、不同类型的 Web 定位器、不同…

[Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具

一.Docker Swarm集群raft算法讲解 Raft &#xff1a;一致性算法&#xff0c;在保证大多数管理节点存活的情况下&#xff0c;集群才能使用&#xff0c; 所以就要求如果集群的话&#xff0c; manager 节点必须 >3 台 &#xff0c;如果是两个台&#xff0c;其中一台宕机&#…

彩纸屋在线少儿编程源码/scratch在线编程系统/培训管理系统源码/在线培训系统源码PHP

源码简介&#xff1a; 彩纸屋在线少儿编程源码&#xff0c;它是scratch在线编程系统&#xff0c;作为培训管理系统源码/在线培训系统源码&#xff0c;采用PHP源码。 彩纸屋是全国首家提供scratch开源定制和少儿编程培训管理系统源代码的服务商&#xff0c;彩纸屋提供的scratc…

一条Update语句的执行过程是怎样的?

先看第一个问题&#xff0c;这里做个简单描述 &#xff0c;因为我们着重还是看Update MySQL执行一条Select语句是怎么运行的&#xff1f; 这个问题大家在面试的时候大家都背过类似的题&#xff0c;而且网上也有很多答案&#xff0c;这里分享一个大致流程介绍&#xff0c;关于…