Android Compose Bloom 项目实战 (一) : 项目说明与配置

news2025/1/11 2:58:57

1. 项目介绍

Bloom是谷歌 AndroidDevChallenge (Android 开发挑战赛) 中的一期活动,目的是为了推广Compose,非常适合用来练手,通过这个项目,我们可以很好的入门Compose。本文介绍了如何从零开始,开发这个Compose项目。

设计稿和素材的下载地址 :
Android Compose Bloom 素材
其中,有个Bloom.pdf,里面是Bloom项目所需的UI设计稿。

我们要实现的效果如下所示,可以看到,一共有三个页面 : 欢迎页、登录页和主页。
在这里插入图片描述

2. 新建项目

首先,我们需要新建一个Compose项目,这里选择Empty Compose Activity

在这里插入图片描述
这里项目名取为Bloom,包名我取为com.heiko.bloom

在这里插入图片描述

3. 配置素材

Bloom PDF的第一页,有我们所需要的素材
在这里插入图片描述

3.1 配置颜色、字体和形状

3.1.1 配置颜色

我们打开com.heiko.bloom.ui.theme包名下的Color.kt,复制如下内容

package com.heiko.bloom.ui.theme

import androidx.compose.ui.graphics.Color

val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5)

val pink100 = Color(0xFFFFF1F1)
val pink900 = Color(0xFF3F2C2C)
val white = Color(0xFFFFFFFF)
val white850 = Color(0xD9FFFFFF)
val gray = Color(0xFF232323)

3.1.2 配置字体

res文件夹下新建font文件夹,将这几个字体放到该文件夹下
在这里插入图片描述

然后,打开com.heiko.bloom.ui.theme包名下的Type.kt,复制如下内容

package com.heiko.bloom.ui.theme

import androidx.compose.material.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.android.style.LetterSpacingSpanEm
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
import com.heiko.bloom.R

// Set of Material typography styles to start with
val Typography = Typography(
    body1 = TextStyle(
        fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, fontSize = 16.sp
    )
)

val nunitoSansFamily = FontFamily(
    Font(R.font.nunitosans_light, FontWeight.Light),
    Font(R.font.nunitosans_semibold, FontWeight.SemiBold),
    Font(R.font.nunitosans_bold, FontWeight.Bold)
)

val h1 = TextStyle(
    fontSize = 18.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.Bold
)

val h2 = TextStyle(
    fontSize = 14.sp,
    fontFamily = nunitoSansFamily,
    letterSpacing = 0.15.sp,
    fontWeight = FontWeight.Bold
)

val subtitle1 = TextStyle(
    fontSize = 16.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.Light
)

val body1 = TextStyle(
    fontSize = 14.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.Light
)

val body2 = TextStyle(
    fontSize = 12.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.Light
)

val button = TextStyle(
    fontSize = 14.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.SemiBold
)

val caption = TextStyle(
    fontSize = 12.sp, fontFamily = nunitoSansFamily, fontWeight = FontWeight.SemiBold
)

3.1.3 配置形状

打开com.heiko.bloom.ui.theme包名下的Shape.kt,复制如下内容

package com.heiko.bloom.ui.theme

import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Shapes
import androidx.compose.ui.unit.dp

val Shapes = Shapes(
    small = RoundedCornerShape(4.dp),
    medium = RoundedCornerShape(4.dp),
    large = RoundedCornerShape(0.dp)
)

val small = RoundedCornerShape(4.dp)
val medium = RoundedCornerShape(24.dp)

3.2 添加资源文件

复制矢量图片到drawable文件夹下
在这里插入图片描述
复制PNG图片到drawable-xxhdpi文件夹下
在这里插入图片描述

3.3 配置沉浸式状态栏

如果不配置这几行代码,状态栏会有特定颜色,这和UI稿不一致,所以我们需要将配置下沉浸式状态栏。

在这里插入图片描述
MainActivityonCreate方法中的最前面(位于setContent{}前面),添加如下代码

//DecorView不再为SystemUI(状态栏和导航栏等)预留Padding
WindowCompat.setDecorFitsSystemWindows(window, false)
val controller = WindowCompat.getInsetsController(window, window.decorView)
//状态栏设为亮色 (状态栏的文字、图标颜色为暗色)
controller?.isAppearanceLightStatusBars = true

style.xml中添加修改主题,并配置到AndroidManifest.xml

<style name="Theme.Bloom" parent="android:Theme.Material.Light.NoActionBar">
	<!--把状态栏设置为透明色-->
	<item name="android:statusBarColor">#00000000</item>
</style>

AndroidManifest.xml

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.Bloom">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

我们再运行项目
在这里插入图片描述
可以看到,状态栏已经是透明色了,而且Hello Android 这个Text的位置已经到了最顶上,和状态栏重叠了。这样我们的目的就达到了,我们可以将图片背景之类的设置在整个页面中,状态栏和其他布局融为一体,达到沉浸式状态的效果。

至此,我们就完成了项目的配置,接下来,我们就要来开发欢迎页了,这个会在下一篇文章中进行介绍 (待更新)

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

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

相关文章

计算机系统结构期末复习

名词解释 程序访问局部性 时间局部性是指最近被访问过的数据很可能再次被访问 空间局部性是指最近被访问过的存储空间的附近空间可能会被访问 计算机体系结构 计算机体系结构是程序员所看到的计算机属性&#xff0c;即概念性结构与功能特性 窗口重叠技术 为了能更简单、更直接…

UE5笔记【五】操作细节——光源、光线参数配置、光照图修复

设置光线重载质量模式为预览&#xff1a;可以加快重构速度。 为了更快速高效的学习&#xff0c;直接查看别人已经建好的素材实例。 在EpicGames启动器中打开示例&#xff0c;找到这个照片级渲染。查看别人建好的效果图。 创建工程以UE5版本打开。进入查看。 观察Baked和碰撞测…

MySQL常用函数大全(面试篇)

本篇文章讲解是是MySQL的函数方法&#xff0c;涵盖所有的MySQL常见的方法。主要介绍了面试常问函数。 一、数字函数二、字符串函数三、日期函数四、MySQL高级函数 &#xff08;一&#xff09;数字函数 1、ABS(x) 返回x的绝对值 2、AVG(expression) 返回一个表达式的平均值&am…

Redis分布式锁

1. 什么是分布式锁 分布式锁指的是&#xff0c;所有服务中的所有线程都去获得同一把锁&#xff0c;但只有一个线程可以成功的获得锁&#xff0c;其他没有获得锁的线程必须全部等待&#xff0c;等到获得锁的线程释放掉锁之后获得了锁才能进行操作。 Redis官网中&#xff0c;set…

中加石墨再冲刺港交所上市:2022年初至今收入为零,陈东尧为CEO

11月18日&#xff0c;中加石墨控股股份有限公司&#xff08;下称“中加石墨”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板&#xff0c;宏信为独家保荐人。据贝多财经了解&#xff0c;这是中加石墨第二次递表&#xff0c;此前曾于2022年2月28日递交上市申请材料…

通过inode结构体取到次设备号,实现LED灯的亮灭

对Linux来说&#xff0c;设备驱动也是文件。驱动控制硬件的过程&#xff0c;实际上是对驱动文件的读写操作。 对内核来说&#xff0c;如何获取唯一的文件标识呢&#xff1f;当然是通过file结构体中的&#xff0c;inode结构体识别应用层打开的到底是哪一个设备文件。 实验操作及…

数据结构题目收录(二十)

1、含有n个非叶结点的m阶B树中至少包含&#xff08;&#xff09;个关键字。 A&#xff1a;n(m1)B&#xff1a;nC&#xff1a;n(┌\ulcorner┌m/2┐\urcorner┐-1)D&#xff1a;(n-1)(┌\ulcorner┌m/2┐\urcorner┐-1)1 解析 除根结点外&#xff0c;m阶B树中的每个非叶结点至…

mongodump工具安装及使用详解

MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装&#xff0c;而是需要自己手动安装。 官方网站下载链接&#xff1a;Download MongoDB Command Line Database Tools | MongoDB 将下载的压缩包通过工具上传到服务器或者虚拟机中某个路径下并解压&…

ZYNQ图像处理项目——线性神经网络识别mnist

一、线性神经网络识别mnist 线性神经网络其实也可以叫做线性分类器&#xff0c;其实就是没有激活函数的神经网络来对目标进行识别&#xff0c;像支持向量机、多元回归等都是线性的。这边我采用了线性神经网络来识别mnist数字。 我这边是看了一本讲神经网络的书籍&#xff0c;然…

分析高数值孔径物镜的聚焦特性

摘要 高数值孔径的物镜广泛用于光刻、显微等方面。 因此&#xff0c;在仿真聚焦时考虑光的矢量性质是至关重要的。VirtualLab可以支持此类透镜的光线和场追迹分析。通过场追迹分析&#xff0c;可以清楚地显示出由于矢量效应引起的非对称焦点。相机探测器和电磁场探测器可以方便…

【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)

目录前言一、 介绍二、 主从复制1. 原理2. 克隆从机3. 克隆从机大坑4. 远程登陆5. 主机配置6. 从机配置7. 主机&#xff1a;建立账户并授权8. 从机&#xff1a;配置需要复制的主机9. 测试10. 停止主从同步三、 读写分离1. Sharding-JDBC介绍2. 一主一从3. 一主一从读写分离3.1 …

安服-windowslinux日志分析

目录 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 rsyrslog.conf中记录了&#xff0c;这些日志文件存储的位置以及存储的内容是关于什么的日志 其中lastlog比较重要&#xff0c;记录了用户登录…

FRP之入门篇

目录 一、前言 1、概述 2、原理 3、支持功能 4、适用场景 二、环境准备 三、使用 1、安装包下载 2、服务端部署 2.1、上传安装包 2.3、启动服务端 3、客户端部署 3.1、代理服务准备 3.2、上传安装包 3.3、客户端配置 3.4、启动客户端 4、功能验证 一、前言 1、…

Redis在Windows和Linux下的安装方法(超级详细)

Redis的两种不同系统安装1. redis在Windows下的安装2. redis在Linux下的安装1. redis在Windows下的安装 下载安装包(https://github.com/MicrosoftArchive/redis/releases) 下载完后得到安装包找一个自己熟悉的路径就可以进行解压了,我放的是D盘 解压后的文件: 进入到文件夹中…

Java集合(二):Map集合与Collections工具类

目录 Map接口 Map接口的常用方法 删除方法 判断方法 查找方法 增加方法 Map常用方法&遍历操作 HashTable 字典-Dictionary,v> HashMap、HashTable和LinkedHashMap TreeMap 【2】TreeMap-存储自定义数据类型-【内部比较器】 HashMap底层源码 jdk8-源码…

央视春晚临近,主持人李思思被爆离职,知情人火速做出回应

每年的这个时候&#xff0c;中央电视台的春晚&#xff0c;都成为人们热议的话题&#xff0c;不过今年的话题却比较火爆。大众们所关注的央视春晚&#xff0c;第一是参加春晚的明星嘉宾&#xff0c;其次就是参加春晚的节目主持人。 说起央视春晚的主持人&#xff0c;最早要追溯到…

【笔试题】【day26】

文章目录第一题&#xff08;就绪队列中的进程数&#xff09;第二题&#xff08;磁盘缓冲区存在的意义&#xff09;第三题&#xff08;进程从执行态变成就绪态的原因&#xff09;第四题&#xff08;管道&#xff09;第五题&#xff08;文件打开&#xff0c;操作系统会做什么&…

python 图像处理(一阶梯度图像和角度图像)

在整个图像处理的学习过程中可以看到&#xff0c;在很多应用中图像强度的变化情况是非常重要的信息。强度的变化可以用灰度图像I&#xff08;对于彩色图像&#xff0c;通常对每个颜色通道分别计算导数&#xff09;的x和y的方向导数和进行描述。 图像的梯度向量为&#xff1a; …

[datawhale202211]跨模态神经搜索实践:前端简介 Streamlit

结论速递 VCED项目使用一个十分简单好用的 Web 应用程序框架Streamlit。 本次任务简单学习Streamlit的基本使用。并逐行阅读学习VCED项目的前端代码&#xff0c;学习数据的传递&#xff0c;中间存储方式&#xff0c;以及功能的实现。 前情回顾 环境配置Jina生态跨模态模型 …

[python]basemap后安装后hello world代码

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.basemap import Basemap m Basemap() # 实例化一个map m.drawcoastlines() # 画海岸线 m.drawmapboundary(fill_colorwhite) m.fillcontinents(colorwhite,lake_colorwhite) # 画大洲&#x…