Android Compose UI实战练手----Google Bloom登录页

目录

  • 1.概述
  • 2.页面展示
    • 1.1 亮色主题
    • 1.2暗色主题
  • 3.登录页面拆分以及编码实现
    • 3.1 登录页面拆分
    • 3.2 编码实现
      • 3.2.1 LoginPage
      • 3.2.2 LoginTitle
      • 3.2.3 LoginInoutBox
      • 3.2.4 LoginHintWithUnderLine
      • 3.2.5 LoginButton
  • 4.源码地址

1.概述

在之前的章节中我们已经介绍了如何实现Google Bloom练手项目的欢迎页,本文介绍如何使用Compose UI实现登录页,登录页使用传统的View去开发的时候需要先去使用XML定义好布局界面,然后在Activity中去加载布局界面,最后拿到对应的输入框ID,按钮ID等去实现登录功能,但是使用Compose UI来实现这些就显得很简单,我们只需要使用Compose UI 的相关组件根据Compose提供的布局组件,组合到一起就可以了,最主要的是拆分页面,让其分成不同的小组件,然后分别用Compose UI实现这些组件,最后组合成界面。

2.页面展示

1.1 亮色主题

在这里插入图片描述

1.2暗色主题

在这里插入图片描述
上面的图片展示的就是我们的登录页面,主要是通过输入邮箱地址和密码来进行登录,这里做的是一个演示,因为要完成一个真正的登录模块还涉及到很多,比如手机号登录,验证码登录,忘记密码,注册等功能,这里仅展示简单的账号密码登录界面。主要目的是熟悉Compose UI的使用

3.登录页面拆分以及编码实现

当我们要编写一个界面时,首先要做的就是做页面的拆分,将页面拆分成一个个的小组件,然后分别编码去实现这些小组件,有些组件例如底部的导航栏啥的分离出来还可以重复使用,所以能做到合理的拆分页面也是很重要的。

3.1 登录页面拆分

在这里插入图片描述
如上图所示,我们拆分完界面发现,可以使用Column组件将我们拆分的子组件堆叠起来就可以了。

3.2 编码实现

在上面我们拆分完登录页面后,接下来就是编码实现了,从拆分的结果中我们可以很轻易的想到,使用一个Column组件将这些子组件堆叠起来,然后根据设计稿添加适当的边距就可以了,代码如下:

3.2.1 LoginPage

这个方法主要是将其他的子组件使用Column组件堆叠到一起形成整个登录页面。

@Composable
fun LoginPage() {Column(modifier =Modifier.fillMaxSize().background(MaterialTheme.colors.background).padding(horizontal = 16.dp)) {LoginTitle()LoginInputBox()LoginHintWithUnderLine();LoginButton()}
}

3.2.2 LoginTitle

这个组件是为了展示登录页面的标题的,从设计稿中可以知道,LoginTitle的文本基线距离顶部184dp,文本基线距离底部16dp,我们可以使用paddingFromBaseline进行设置。代码如下:

@Composable
fun LoginTitle() {Text(text = "Log in with email",modifier = Modifier.fillMaxWidth().paddingFromBaseline(top = 184.dp,bottom = 16.dp),style = MaterialTheme.typography.h1,color = MaterialTheme.colors.primary,textAlign = TextAlign.Center)
}

3.2.3 LoginInoutBox

这个组件时两个文本输入框的堆叠,我们可以使用OutlineTextField予以实现,因为两个输入框的代码大部分都是一样的,所以我们可以提取一个公共的组件LoginTextField,调用的时候传入Placeholder即可,代码如下所示:

@Composable
fun LoginInputBox() {Column {LoginTextField(placeHolder = "Email address")Spacer(modifier = Modifier.height(8.dp))LoginTextField(placeHolder = "Password(8+ Characters)")}
}@Composable
fun LoginTextField(placeHolder: String) {OutlinedTextField(value = "", onValueChange = {},modifier = Modifier.fillMaxWidth().height(56.dp).clip(MaterialTheme.shapes.small).border(1.dp, MaterialTheme.colors.primary),placeholder = {Text(text = placeHolder,style = MaterialTheme.typography.body1,color = MaterialTheme.colors.primary)})
}

3.2.4 LoginHintWithUnderLine

这个组件比较麻烦一点,虽然Text组件本身支持为文本串添加下划线,但并不支持仅对文本中具体某几个单词添加下划线,所以需要我们自己自定义下Composable组件,我们可以把这个组件分为TopText与BottomText两部分:
在这里插入图片描述
TopText 可以看作时对整行单词进行两端对齐,而BottomText 则看作是居中对齐,我们只需要将这两部分组合即可:

@Composable
fun LoginHintWithUnderLine() {Column(modifier = Modifier.paddingFromBaseline(top = 24.dp, bottom = 16.dp)) {TopText()BottomText()}
}

TopText中需要使用到Row组件并设置两端对齐,然后将句子分词,对每个单词创建出对应的Text组件添加到Row中,然后在需要带下划线的单词中单独插入Row组件里,代码如下:

@Composable
fun TopText() {Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.SpaceBetween //设置两端对齐) {val keyWorldPre = "By Clicking below you agree to our".split(" ")val keyWorldPost = "and consent".split(" ")for (word in keyWorldPre) {Text(text = word,style = MaterialTheme.typography.body2,color = MaterialTheme.colors.primary)}Text(text = "Terms of Use",style = MaterialTheme.typography.body2,color = MaterialTheme.colors.primary,textDecoration = TextDecoration.Underline)for (word in keyWorldPost) {Text(text = word,style = MaterialTheme.typography.body2,color = MaterialTheme.colors.primary)}}
}

BottomText是一个居中对齐的文本,实现起来很简单,代码如下:

@Composable
fun BottomText() {Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.Center) {Text(text = " to Our",style = MaterialTheme.typography.body2,color = MaterialTheme.colors.primary)Text(text = "Privacy policy.",style = MaterialTheme.typography.body2,color = MaterialTheme.colors.primary)}
}

这样LoginHintWithUnderLine组件就完成了,接下来看登录按钮组件

3.2.5 LoginButton

LoginButton组件实际上就是一个按钮,实现起来也很简单,不多赘述,代码如下:

@Composable
fun LoginButton(){Button(onClick = { /*TODO*/ },modifier = Modifier.height(48.dp).fillMaxWidth().clip(MaterialTheme.shapes.medium),colors = ButtonDefaults.buttonColors(MaterialTheme.colors.onBackground)) {Text(text = "Log in", style = MaterialTheme.typography.button, color = MaterialTheme.colors.onPrimary)}
}

至此一个登录页面就完成了,这里只是一个简单的登录界面演示,主要是为了熟悉如何使用ComposeUI编写Android页面。

4.源码地址

整个项目的源码已经上传到Github,刚兴趣的小伙伴欢迎下载,提交新的Compose页面。下一篇博客我们将会介绍Home主页的编写,敬请期待。
GitHub源码地址

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

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

相关文章

什么是网络货运平台?

一、什么是网络货运平台? 网络货运平台是依托互联网平台整合配置运输资源,以承运人身份与托运人签订运输服务合同、承担承运人责任,委托实际承运人完成运输服务的物流平台。它通过互联网形式实现运输过程真实、公平、公正、合法&#xff0c…

logback-spring.xml详解

本文来写说下logback-spring.xml相关的知识与概念 文章目录 概述configuration元素定义上下文名称定义变量appender组件RollingFileAppender配置logger配置root配置ELK的配置输出logback状态数据异步输出日志代码中的日志格式本文小结 概述 对于xml日志文件的配置,大…

前端web入门-移动web-day09

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 空间转换 空间转换 – 平移 视距 perspective 空间 – 旋转 立体呈现 – transform-style 空间转换…

Ubuntu下编译VTK

1.先安装QT,不知道不装行不行,我们项目需要。 2.去VTK官网下载VTK源码。 3.解压源码。 4.编译需要用cmake-gui,装QT的一般都有,但需要把路径添加到PATH才能用。 5.打开cmake-gui,设置源码路径,编译输出路…

只要你会vue,5分钟学不会 svelte 你来找我

🌻 前言 2023年了,国内前端领域基本被Vue、React占领市场,近几年似乎前端技术栈的迭代更新缓慢了下来。 当然近几年也出现了像svelte、solid.js等一些新兴的前端框架,这些框架有很多创新的点,比如svelte相比于vue,re…

JS文件UTF8格式乱码问题

UTF8格式的JS文件在IE中显示乱码问题的解决 这种情况通常是由于JS文件头缺少BOM标志引起的,解决方式: 方法1:用系统自带记事本,另存为 UTF-8,覆盖原文件,会自动加上BOM标志(就是文件开头的EF BB BF 三个字节) 方法2: 用notepad 打开,编码菜单,由UTF8编码改为 UTF8-BOM编码

利用RabbitMQ实现消息投递削峰填谷

目录 异步和同步如何选择 异步线程 同步收发消息 一、导入依赖库 二、创建RabbitMQ配置类 三、创建消息任务类 异步和同步如何选择 依靠多线程,Java代码可以同步执行也可以异步执行 RabbitMQ提供了同步和异步两种收发消息模式 我们采用 Java异步线程 MQ同步…

机器学习小结之决策树

文章目录 前言一、介绍1.1 原理1.2 流程1.3 信息熵,信息增益和基尼不纯度 二、构建决策树2.1 特征选择2.2 决策树生成2.3 剪枝 三、经典算法3.1 ID33.2 C4.53.3 CART 四、案例4.1 Iris 数据集 鸢尾花 分类4.2 基于决策树的英雄联盟游戏胜负预测 参考 前言 决策树(D…

盒马上市,即时零售最大“变量”

若盒马年内成功上市,等待完成下一轮融资的朴朴超市的处境恐将更加尴尬,另区域性中小商超或将迎来新一轮倒闭潮。 疫情过后,国内消费市场一直处于走弱态势。据商务大数据监测,今年端午假期,部分地区零售和餐饮数据远不及…

2023年前端面试汇总-React

1. 组件基础 1.1. React事件机制 <div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&#xff0c;React将事…

【Linux】基础IO——文件描述符/缓冲区/重定向/文件系统

文章目录 一、文件描述符二、缓冲区三、重定向的原理四、文件系统 (Linux Ext2)1 认识磁盘的结构CHSLBABlock 2 认识文件系统2.1 分区2.2 文件系统的结构2.3 剖析inode2.4 文件的操作 3 软硬链接3.1 软链接3.2 硬链接 &#x1f4dd; 个人主页 &#xff1a;超人不会飞)&#x1f…

JVM 常量池、即时编译与解析器、逃逸分析

一、常量池 1.1、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue&#xff0c;然后再hash生成index, 改index就是key&#xff1b;Value是一个HashTableEntry&#xff1b; 1、key hashValue hash string(name&#xff0c; len) i…