Compose (9/N) - 主题 Theme

news/2025/3/29 19:39:16/

一、Material Design

直接把任何Composable函数用 MaterialTheme{ } 包裹起来,就可以使用相关属性了。也可以单独将某个属性拿出来使用。

1.1 颜色 Color

primary

主色,屏幕和元素都用这个颜色。

primaryVariant

用于区分主色,比如app bar和system bar。

secondary

次要色提供强调和区分。适合于悬浮按钮、单选/复选框按钮、高亮选定的文本、链接和标题。

secondaryVariant

用于区分次要色。

background

背景色出现在可滚动的内容后面。

surface

表面色用于组件的表面,如CardView、SheetLayout、Menu。

error

错误色用于表示组件内的错误,如TextField的提示信息。

onPrimary

用于显示在主色之上的文本和图标的颜色。

onSecondary

用于显示在次要色之上的文本和图标的颜色。

onBackground

显示在背景色之上的文本和图标的颜色。

onSurface

显示在表面色之上的文本和图标所使用的颜色。

onError

显示在错误色之上的文本和图标所用的颜色。

isLight

是否是浅色模式。
@Composable
fun Show() {Text(text = "",
//        color = Color(0xffff00ff)   //硬编码在配置的地方把值写死会无法支持主题切换
//        color = MaterialTheme.colors.primary    //应该从主题中引用对应值color = MaterialTheme.colors.primary.copy(alpha = 0.5F), //每个值都是Color实例还能通过copy()修改ARGB参数)Surface(   //指定颜色更多的是在外部用一层Surface包裹来指定//避免在深色主题中大面积使用明亮颜色,一般是浅色主题使用primary深色主题使用surface,可以直接将颜色设为primarySurfacecolor = MaterialTheme.colors.primarySurface, contentColor = contentColorFor(backgroundColor = MaterialTheme.colors.primary)) { }
}

1.2 排版 Typography

h1 ~ h6

标题,字号1最大6最小。

subtitle1、subtitle2

副标题,字号1大2小。

body1、body2

正文,字号1大2小。

button

按钮文本。

caption

图片说明。

overline

上划线。

 

@Composable
fun Show() {Text(text = buildAnnotatedString {append("以下不同样式的文字:\n")withStyle(SpanStyle(color = Color.Red)){append("红色,")}withStyle(SpanStyle(fontSize = 24.sp)){append("大字,")}val myStyle = MaterialTheme.typography.overline.toSpanStyle().copy(background = MaterialTheme.colors.primary.copy(alpha = 0.5F))withStyle(myStyle) {append("自定义,")}})
}

1.3 形状 Shape

small

小组件使用的形状,例如Button、SnackBar、悬浮按钮...

medium

中组件使用的形状,例如CardView、AlertDialog...
large大组件使用的形状,例如ModalDrawer、ModalBottomSheetLayout...
@Composable
fun Show() = MaterialTheme{...}@Composable
fun Show() {val colors = MaterialTheme.colors   //获取颜色val typography = MaterialTheme.typography   //获取排版val shapes = MaterialTheme.shapes   //获取形状Surface(shape = shapes.large,elevation = 10.dp) {Text(text = "Hello Word!",color = colors.primary,style = typography.body2)}

二、复制并改写

可以通过 copy( ) 复制主题然后改写属性。

@Composable
fun Counter() {val myStyle = MaterialTheme.typography.h3.copy(color = Color.Red)Text(text = "Hello Word!",style = myStyle)
}

三、容器函数

可以将基础配置设置到容器中,这样容器中的所有Composable函数都会默认带上该配置。

@Preview
@Composable
fun Show() {Container{Text(text = "你好")}
}@Composable
fun Container(content: @Composable () -> Unit){Surface(color = Color.Yellow, modifier = Modifier.padding(10.dp)) {content()}
}

四、自定义

创建项目之后,就会生成一个 项目名称+Theme 的 @Compose 方法,我们可以通过更改其中的颜色来完成对主题的修改。硬编码在配置的地方把值写死会无法支持主题切换,应该从主题中引用对应值,由于每个值都是实例还能通过 copy() 修改。

@Composable
fun MyTheme(darkMode: Boolean = isSystemInDarkTheme(),  //是否是暗黑模式,默认根据系统设置content: @Composable () -> Unit //传入子容器
) {MaterialTheme(//将自定义的色值传入同理 shapes、tygraphycolors = if (darkMode) darkColors else lightColors) {content()   //被包裹的子容器会默认设置为该主题}
}//自定义浅色模式
private val lightColors = lightColors(//以下都是系统默认值primary = Color(0xFF6200EE),primaryVariant = Color(0xFF3700B3),secondary = Color(0xFF03DAC6),secondaryVariant = Color(0xFF018786),background = Color.White,surface = Color.White,error = Color(0xFFB00020),onPrimary = Color.White,onSecondary = Color.Black,onBackground = Color.Black,onSurface = Color.Black,onError = Color.White
)//自定义深色模式
private val darkColors = darkColors(//以下都是系统默认值primary = Color(0xFFBB86FC),primaryVariant = Color(0xFF3700B3),secondary = Color(0xFF03DAC6),secondaryVariant = Color(0xFF03DAC6),background = Color(0xFF121212),surface = Color(0xFF121212),error = Color(0xFFCF6679),onPrimary = Color.Black,onSecondary = Color.Black,onBackground = Color.White,onSurface = Color.White,onError = Color.Black
)

http://www.ppmy.cn/news/310762.html

相关文章

android 登录注册动画,Android开发(14)——动画实战:炫酷登录

本节内容 1.第三方库实现虚化 2.添加输入框和按钮 3.按钮状态 4.键盘隐藏 5.监听焦点改变的事件 6.手臂旋转动画 7.手掌和手臂动画 Demo简介 1.做一个炫酷登录的界面。 image.png 当我们输入密码的时候,猫头鹰会捂住眼睛。点击其他地方后,它的手臂又会张…

Android开发帮助技巧(适用于入门)二

Android配置配置清单,Gradle构建文件,外部化资源部分。 (一)配置清单AndroidManifest.xml use-permission和uses-feature和application属于同等级节点。 android:allowBackup 是否允许应用参与备份和恢复基础架构。如果将此属性设为 fals…

【php + MySQL + Android】Android登陆界面设计(1)

前言 自己要做一个Android App,涉及到服务器端的用户数据管理,而网络上的的资源往往是只讲一个方面。所以自己每完成一段工作,会将开发过程记录下来,并供大家参考,相关文章放在专栏 【php MySQL Android】。 如果…

Jetpack Compose 初体验(上),retrofit原理面试

声明 Typography 对象,然后给 Text 添加 style 属性,来控制文字的样式。 Preview(showBackground true) Composable fun VerticalText() { val typography MaterialTheme.typography Column( modifier Modifier.padding(16.dp) ) { Image( painter …

scnu校赛去年题

求两个数的公约数有多少个 #include<iostream> #include<bits/stdc.h> using namespace std; int gcd(int a,int b){return b?gcd(b,a%b):a; } int main(){int T,a,b;cin>>T;while(T--){int ans1;cin>>a>>b;int ggcd(a,b);if(g1){cout<<…

STM32F10xx串口通信

一、通信方式相关 1.1 并行通信 1.2 串行通信 串行通信的通信方式&#xff1a; 常见的串行通信接口&#xff1a; STM32的串口通信接口 USART&#xff1a;通用异步收发器UART&#xff1a;通用同步异步收发器STM32F10x大容量系列芯片&#xff0c;包含3个USART&#xff08;支持异…

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

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

2020年第11届蓝桥杯国赛javaC组

6.2020国赛javaC组 https://blog.csdn.net/qq_43449564/article/details/109841937 https://blog.csdn.net/imreal_/article/details/114272929 https://www.dtmao.cc/news_show_375163.shtml C 扩散 import java.util.LinkedList; import java.util.Queue; //定义每一个点…