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

news2024/11/20 6:31:16

目录

  • 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.coloradmin.cn/o/699370.html

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

相关文章

每个前端开发需要了解的10个强大的CSS属性

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的,我们出的钱 体验地…

vue 启动项目报错:TypeError: Cannot set property ‘parent‘ of undefined异常解决

场景:从git上面拉下来一个项目 npm i 下载完依赖以后 npm run serve 去运行项目的时候 报错TypeError: Cannot set property ‘parent’ of undefined 如图所示 原因:首先排查发现判断得出是less解析失败导致 但是经过长时间的查询解决方案发现是因为v…

【Redis一】Redis简介及安装部署

Redis简介及安装部署 1.关系数据库 VS 非关系型数据库1.1 关系型数据库1.2 非关系型数据库1.3 关系型数据库和非关系型数据库区别1.4 非关系型数据库产生背景1.5 关系型数据库与非关系型数据库总结 2.Redis简介2.1 Redis概述2.2 Redis的优点2.3 Redis使用场景2.4 关于Redis的高…

nginx配置vue项目添加访问前缀

文章目录 前言实现需求Nginx配置访问前端正确配置注意点alias的含义举个栗子静态文件及js等404错误 前言 最近,在搞一个SASS系统,将原有的单服务,每次卖出一套啥软件就需要部署一套环境,使得运维人员有些捉襟见肘。产品调整为SAS…

链表理论基础

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,一个是指针域(存放指向下一节点的指针)。 链表的类型 单链表 每一个节点由两部分组成,一个是数据域一个是指针域&#xf…

汽车 EDI:博泽 brose EDI 需求分析

brose(博泽)是一家德国汽车零部件制造商,总部位于德国科堡。该公司成立于1908年,至今已有百年历史。brose主要专注于汽车驾驶员控制系统、座椅系统、电动驱动系统和电子技术等领域的开发和生产。作为一家全球化企业,br…

linux修改root密码

Linux修改root密码 红帽系统: 进入开机界面按e。 在linux这行末尾加上rd.break 然后按下ctrlx 按下图输入命令: redhat 即为你想修改的密码。 然后回车等待系统重启。 CentOS7: 前两步和之前一样,然后找到linux16这一行。 在这行末尾…

芯片设计中的功耗挑战和低功耗设计

在早期的IC设计中,关注的参数主要是性能(timing)和面积(area)。EDA工具在满足性能要求的情况下,最小化面积。此时,功耗是一个不怎么被关心的问题。 因为CMOS工艺在相对较低的时钟频率下具有相当低的功耗,漏电流可忽略不计。随着晶…

springboot+vue校园车辆校车调度管理系统_r4le2-

本论文中实现的校车调度管理系统将以用户核心的日常信息维护工作为主,主要涵盖了首页,个人中心,驾驶员管理,车辆信息管理,借调车辆管理,车辆调度管理,车辆运营管理等功能,采用该校车…

浏览器如何捕获元素的hover事件弹出的内容,并进行样式调整修改

项目场景: 最近前端需要重写antd的tab卡片的更多内容弹框,默认的背景色和文本颜色不合适,需要更改。 问题描述 只有鼠标指针放上去后才会显示弹出的内容 直接用审查元素还无法进行获取。 如何用浏览器的开发者工具去捕获这些浮框内容或其他…

js中的图是什么?

图 什么是图? 图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在 JavaScript 中没有图,但是可以通过 Object 和 Array 来构建图。 常用操作 深度优先遍历广度优先遍历 图的表示法 …

sql内外连接图示

student表数据: idname34name22golitter66kerwin123yh12golemon score表数据: idscore34802298663345100 内连接 1、内连接:俗称左右拼接连接; 2、内连接特点:满足连接条件的才会出现在结果里面; SELECT 查询字段…

第 7 章 集合-----Scala集合继承图

7.1.1 不可变集合继承图 7.1.2 可变集合继承图 7.2.3 不可变数组与可变数组的转换 7.7.6 复杂 WordCount 案例 1)方式一 object TestWordCount {def main(args: Array[String]): Unit {// 第一种方式(不通用)val tupleList List(("H…

WebRTC的认知入门

一、学习目的 当前的音视频聊天功能很普通,社会对这方面的需求也很高,疫情期间的在线问诊模式解决类大量急需就医问诊患者的燃眉之急,我们需要了解WebRTC实现实时音视频聊天功能是如何操作的。 二、概念 什么是WebRTC?WebRTC是 Google 在…

开放式耳机是什么意思?开放式耳机和封闭式耳机区别又有哪些?

开放式蓝牙耳机的设计理念旨在为用户提供更加自然、开放的音频体验。与传统的封闭式耳机相比,开放式耳机的设计目的是最大程度地减少音频在耳道中的阻隔,使周围环境的声音与耳机音频混合在一起,创造更加逼真的音场感。 开放式蓝牙耳机非常适合…

6.3.2 可翻页检视

前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到屏幕上面。一页一页翻动的指令就是more和less。 more (一页一页翻动) 看到上面的范例,如果more后面接的文件内容行数大于屏幕输出的行数时,就会出现类…

Hello算法笔记之回溯

一、回溯算法介绍:一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。 通常采用「深度优…

【论文阅读】【yolo系列】YOLACT Real-time Instance Segmentation

论文链接:https://arxiv.org/pdf/1904.02689.pdf Abstract 我们提出了一个简单的、全卷积的实时实例分割模型, 【速度和精度】该模型在TitanXp上训练MSCOCO数据集以33.5帧ps的速度达到29.8 mAP,比以往任何竞争方法都要快得多。此外&#xff0…

chatgpt赋能python:Python连接蓝牙模块:实现IoT设备的控制

Python连接蓝牙模块:实现IoT设备的控制 随着物联网技术的不断发展,连接设备的关键变得越来越重要。Python语言是一种灵活易用、快速上手的编程语言,已经成为众多物联网应用的首选编程语言之一。其中,Python连接蓝牙模块的应用越来…

【聚类算法】MeanShift算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 MeanShift算法,同样是一种基于密度的聚类算法。两种算法直观理解都比较好理解。 DBSCAN:向身边人逐渐发展下线模式 MeanShfit&…