跳转到内容

Text ​

Text 组件是 Miuix 中的基础文本组件,用于显示文字内容。支持自定义各种文本样式、对齐方式和装饰效果。

引入 ​

kotlin
import top.yukonga.miuix.kmp.basic.Text

基本用法 ​

最简单的文本展示:

kotlin
Text("这是一段基本文本")

文本样式 ​

Miuix 提供了多种预定义的文本样式:

kotlin
Text(
    text = "标题文本",
    style = MiuixTheme.textStyles.headline1
)

Text(
    text = "小标题文本",
    style = MiuixTheme.textStyles.subtitle
)
Text(
    text = "摘要文本",
    style = MiuixTheme.textStyles.body2
)

Text(
    text = "正文文本",
    style = MiuixTheme.textStyles.main
)

文本颜色 ​

kotlin
Text(
    text = "默认颜色文本",
    color = MiuixTheme.colorScheme.onBackground
)

Text(
    text = "主题色文本",
    color = MiuixTheme.colorScheme.primary
)

Text(
    text = "次要文本",
    color = MiuixTheme.colorScheme.onSurfaceContainerVariant
)

属性 ​

Text(String)属性 ​

属性名类型说明默认值是否必须
textString要显示的文本内容-是
modifierModifier应用于文本的修饰符Modifier否
colorColor文本颜色Color.Unspecified否
autoSizeTextAutoSize?文本自动调整大小行为null否
fontSizeTextUnit文本字号TextUnit.Unspecified否
fontStyleFontStyle?文本字体风格(如斜体)null否
fontWeightFontWeight?文本字重null否
fontFamilyFontFamily?文本字体族null否
letterSpacingTextUnit字母间距TextUnit.Unspecified否
textDecorationTextDecoration?文本装饰(如下划线)null否
textAlignTextAlign?文本对齐方式null否
lineHeightTextUnit行高TextUnit.Unspecified否
overflowTextOverflow文本溢出处理方式TextOverflow.Clip否
softWrapBoolean是否自动换行true否
maxLinesInt最大行数Int.MAX_VALUE否
minLinesInt最小行数1否
onTextLayout((TextLayoutResult) -> Unit)?文本布局完成后的回调null否
styleTextStyle文本样式MiuixTheme.textStyles.main否

Text(AnnotatedString)属性 ​

属性名类型说明默认值是否必须
textAnnotatedString带注解的富文本-是
modifierModifier应用于文本的修饰符Modifier否
colorColor文本颜色Color.Unspecified否
autoSizeTextAutoSize?文本自动调整大小行为null否
fontSizeTextUnit文本字号TextUnit.Unspecified否
fontStyleFontStyle?文本字体风格null否
fontWeightFontWeight?文本字重null否
fontFamilyFontFamily?文本字体族null否
letterSpacingTextUnit字母间距TextUnit.Unspecified否
textDecorationTextDecoration?文本装饰null否
textAlignTextAlign?文本对齐方式null否
lineHeightTextUnit行高TextUnit.Unspecified否
overflowTextOverflow文本溢出处理方式TextOverflow.Clip否
softWrapBoolean是否自动换行true否
maxLinesInt最大行数Int.MAX_VALUE否
minLinesInt最小行数1否
inlineContentMap<String, InlineTextContent>内联可组合项的映射mapOf()否
onTextLayout(TextLayoutResult) -> Unit文本布局完成后的回调{}否
styleTextStyle文本样式MiuixTheme.textStyles.main否

进阶用法 ​

多行文本截断 ​

kotlin
Text(
    text = "这是一段很长很长的文本,当空间不足时会被截断并显示省略号,这在显示长内容摘要时很有用。",
    maxLines = 2,
    overflow = TextOverflow.Ellipsis
)

文本装饰 ​

kotlin
Text(
    text = "带下划线的文本",
    textDecoration = TextDecoration.Underline
)

Text(
    text = "带删除线的文本",
    textDecoration = TextDecoration.LineThrough
)

富文本混排 ​

kotlin
Text(
    buildAnnotatedString {
        withStyle(style = SpanStyle(color = MiuixTheme.colorScheme.primary)) {
            append("Miuix ")
        }
        withStyle(style = SpanStyle(fontWeight = FontWeight.Bold)) {
            append("UI 库")
        }
        append(",这是一段富文本")
    }
)

文本自动适配 ​

使用 TextAutoSize 让文本在可用空间内自动调整字号:

kotlin
Text(
    text = "自适应文本",
    autoSize = TextAutoSize.StepBased(
        minFontSize = 12.sp,
        maxFontSize = 17.sp,
        stepSize = 0.3.sp
    )
)

高频变化的文本颜色 ​

Text(String, ...) 与 Text(AnnotatedString, ...) 各自还提供一个以 ColorProducer 替换 Color 的重载:

kotlin
fun Text(text: String, color: ColorProducer, modifier: Modifier = Modifier, ...)
fun Text(text: AnnotatedString, color: ColorProducer, modifier: Modifier = Modifier, ...)

其余参数均与上方表格一致。回调会在绘制阶段直接读取最新值,因此当文本颜色每帧都在变化(动画、滚动联动、手势驱动等)时,Text 自身可以跳过重组:

kotlin
val scrollState = rememberScrollState()
Text(
    text = "随滚动渐变的文本",
    color = {
        lerp(
            MiuixTheme.colorScheme.onSurface,
            MiuixTheme.colorScheme.primary,
            (scrollState.value / 500f).coerceIn(0f, 1f),
        )
    },
)

可点击链接 ​

通过 AnnotatedString 和 LinkAnnotation 创建可点击链接:

kotlin
val annotated = buildAnnotatedString {
    append("访问 ")
    val start = length
    append("Miuix 文档站")
    addLink(
        LinkAnnotation.Url(
            url = "https://compose-miuix-ui.github.io/miuix/",
            styles = TextLinkStyles(
                SpanStyle(color = MiuixTheme.colorScheme.primary, fontWeight = FontWeight.Bold)
            )
        ),
        start = start,
        end = length
    )
}

Text(text = annotated)

变更日志

基于 Apache-2.0 许可发布