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)
    @Composable
    fun 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.mfbz.cn/a/188254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.前端--HTML标签3【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

[蓝桥杯训练]———高精度乘法、除法

高精度乘法、除法 一、高精度乘法⭐1.1 初步理解1.1.1 高精度的定义1.1.2 为什么会有高精度1.1.3 高精度乘法的复杂度 1.2 思想讲解1.3 代码实现1.3.1 声明1.3.2 实现高精度乘法1.3.3 整体实现1.3.4 代码测试 二、高精度除法⭐2.1 初步理解2.2 思想讲解2.3 代码实现2.3.1 声明2…

【Vulnhub靶机】Jarbas--Jenkins

文章目录 信息收集主机发现端口扫描目录爆破 漏洞探测whatwebhash-identifierwhatweb 文档说明&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 靶机下载&#xff1a;Download (Mirror): 信息收集 主机发现 扫描C段 sudo nmap -sn 10.9.75.0/24端口扫描 sudo nma…

【教学类-06-11】20231125(55格版)X-Y之间“除法÷题”(以1-9乘法口诀表倒推)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 前面三篇写到了随机加法、随机减法、随机乘法&#xff0c;既然做了三套&#xff0c;怎么能不试试最后一款“除法”呢 模仿乘法版本&#xff0c;制作打乱版和正…

安卓用SQLite数据库存储数据

什么是SQLite&#xff1f; SQLite是安卓中的轻量级内置数据库&#xff0c;不需要设置用户名和密码就可以使用。资源占用较少&#xff0c;运算速度也比较快。 SQLite支持&#xff1a;null&#xff08;空&#xff09;、integer&#xff08;整形&#xff09;、real&#xff08;小…

前端入门(三)Vue生命周期、组件技术、脚手架、存储、事件总线、

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混…

安卓系统修图软件(一)

平时我们会不时在朋友圈发自己的自拍照&#xff0c;或者是风景图等&#xff0c;许多小伙伴们此时会对照片进行一定的修理&#xff0c;比如添加滤镜等操作。在电脑上用ps修图比较繁琐&#xff0c;日常中大可不必用这把宰牛刀&#xff1b;而手机自带的编辑器&#xff0c;或者是QQ…

【Java基础系列】文件上传功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

反思一次效能提升

前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。 改进前 在同一个产品团队&#xff0c;同时有前端工程师和后端工程师。他们经常需要共同协作完成features。 前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。 打包后&#xff0c…

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

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

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

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

如何通过ShardingJDBC进行读写分离

背景信息&#xff1a; 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库。其中主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作&#…

【Qt绘制仪表盘】

目的 使用Qt的绘制事件绘制一个仪表盘 思路 需要创建一个带绘制事件的控件重写绘制事件显示 实现 以下是实现代码&#xff0c;可复制到程序到&#xff0c;直接运行。 .h // GaugeWidget.h #ifndef GAUGEWIDGET_H #define GAUGEWIDGET_H#include <QWidget>class Ga…

Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/3)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

【WSA】无法打开 适用于 Android™ 的 Windows 子系统,因为它处于脱机状态。可能缺少存储设备,或者存储设备已断开连接。

问题描述 之前可以正常使用适用于 Android™ 的 Windows 子系统&#xff08;WSA&#xff09;&#xff0c;但突然间无法启动了。 当尝试启动WSA中的软件时&#xff0c;都会出现以下错误提示&#xff1a; 无法打开 适用于 Android™ 的 Windows 子系统&#xff0c;因为它处于脱…

《微信小程序开发从入门到实战》学习三十

3.4 开发参与投票页面 3.3.7 获取用户信息 如果投票是实名投票&#xff0c;那么用户点击完成确认投票时&#xff0c;需要将用户投票信息和用户昵称一起提交&#xff0c;可以在JS文件中使用API接口wx.getuserInfo获取用户的信息。 使用wx.getUserInfo接口前需要对获取 用户信…

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…

ethernet II 的故事

以太帧有很多种类型。不同类型的帧具有不同的格式和MTU值。但在同种物理媒体上都可同时存在。 以太网第二版或者称之为Ethernet II 帧&#xff0c;DIX帧&#xff0c;是最常见的帧类型。并通常直接被IP协议使用。 格式 当数据帧到达网卡时&#xff0c;网卡要先去掉前导码&#…

leetcode刷题详解四

25. K 个一组翻转链表 这道题本质上还是用的反转前n个链表的思想。 具体细节如下&#xff1a; 先调用一次函数&#xff0c;使用一个newHead接受返回值&#xff0c;这个是为了方便最后函数的返回。 调用reverseN这个函数的时候&#xff0c;要标记反转这段链表的前置节点和后置节…