Compose 基础 - MaterialTheme

文章介绍了如何在Android的JetpackCompose中应用MaterialDesign,包括颜色系统的使用,如primary、secondary和背景色等,排版Typography的各种样式,以及Shape的不同形状。文章还展示了如何在Composable函数中应用这些设计原则,创建可自定义的主题,并通过Container函数进行组件配置。

一、Material Design

直接把任何组合函数用 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,可以直接将颜色设为primarySurface
        color = 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()
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值