1.应用范围的主题
Jetpack Compose 提供了 Material Design 的实现,后者是一个用于创建数字化界面的综合设计系统。Material Design 组件(按钮、卡片、开关等)在 Material Theming 的基础上构建而成,Material Theming 是一种系统化的方法,用于自定义 Material Design 以更好地反映您产品的品牌。一个 Material Theme 由颜色、排版和形状属性组成。当您自定义这些属性时,您所做的更改会自动反映在您用来构建应用的组件中。
Jetpack Compose 使用 MaterialTheme 可组合项实现这些概念:
MaterialTheme(
colors = …,
typography = …,
shapes = …
) {
// app content
}
复制代码
1.1 颜色
颜色在 Compose 中使用 Color 类(一个简单的数据存放类)进行建模。虽然您可以按照自己喜欢的方式随意组织这些颜色(作为顶级常量、在单例中或以内嵌方式定义),但我们强烈建议您在主题中指定颜色并从中检索颜色。
Compose 提供了 Colors 类来对 Material 颜色系统进行建模。Colors 提供了构建器函数来创建成套的浅色或深色:
private val Yellow200 = Color(0xffffeb46)
private val Blue200 = Color(0xff91a4fc)
// ...
private val DarkColors = darkColors(
primary = Yellow200,
secondary = Blue200,
// ...
)
private val LightColors = lightColors(
primary = Yellow500,
primaryVariant = Yellow400,
secondary = Blue700,
// ...
)
// 定义 Colors 后,您可以将其传递给 MaterialTheme:
MaterialTheme(
colors = if (darkTheme) DarkColors else LightColors
) {
// app content
}
复制代码
使用主题颜色
表面和内容颜色
内容 Alpha 值
深色主题
扩展 Material 颜色
1.2 字体排版
Material 定义了一个字型系统,鼓励您使用少量从语义上命名的样式。Compose 使用 Typography、TextStyle 和字体相关类来实现字型系统。Typography 构造函数可以提供每种样式的默认值,因此您可以省略不希望自定义的任何样式:
val Rubik = FontFamily(
Font(R.font.rubik_regular),
Font(R.font.rubik_medium, FontWeight.W500),
Font(R.font.rubik_bold, FontWeight.Bold)
)
val MyTypography = Typography(
h1 = TextStyle(
fontFamily = Rubik,
fontWeight = FontWeight.W300,
fontSize = 96.sp
),
body1 = TextStyle(
fontFamily = Rubik,
fontWeight = FontWeight.W600,
fontSize = 16.sp
)
/*...*/
)
MaterialTheme(typography = MyTypography, /*...*/)
复制代码
如果您希望自始至终使用同一字体,请指定 defaultFontFamily 参数,并省略所有 TextStyle 元素的 fontFamily:
val typography = Typography(defaultFontFamily = Rubik)
MaterialTheme(typography = typography, /*...*/)
复制代码
您可以从主题检索 TextStyle,如以下示例所示:
Text(
text = "Subtitle2 styled",
style = MaterialTheme.typography.subtitle2
)
复制代码
1.3 形状
Compose 使用 Shapes 类来实现形状系统,该类可让您为每个类别指定一个 CornerBasedShape:
val Shapes = Shapes(
small = RoundedCornerShape(percent = 50),
medium = RoundedCornerShape(0f),
large = CutCornerShape(
topStart = 16.dp,
topEnd = 0.dp,
bottomEnd = 0.dp,
bottomStart = 16.dp
)
)
MaterialTheme(shapes = Shapes, /*...*/)
复制代码
默认情况下,许多组件使用这些形状。例如,Button、TextField 和 FloatingActionButton 默认为“小”,AlertDialog 默认为“中”,而 ModalDrawer 默认为“大”。
Surface(
shape = MaterialTheme.shapes.medium, /*...*/
) {
/*...*/
}
复制代码
2.组件样式
在 Compose 中,没有关于组件样式的明确概念,因为您可以通过创建自己的可组合项来提供此功能。例如,如需创建按钮的样式,请将一个按钮封装在您自己的可组合函数中,直接设置您希望更改的参数,并将其他参数以参数形式提供给包含该按钮的可组合项。
@Composable
fun LoginButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
content: @Composable RowScope.() -> Unit
) {
Button(
colors = ButtonDefaults.buttonColors(
backgroundColor = MaterialTheme.colors.secondary
),
onClick = onClick,
modifier = modifier,
content = content
)
}
复制代码
3.自定义设计系统
虽然 Material 是我们推荐的设计系统并且 Jetpack Compose 附带了 Material 的实现,但您并非只能使用它。您完全可以采用同样的方式创建自己的设计系统;Material 完全基于公共 API,您可以使用这些 API 来实现此目的。
评论