跳转到内容

Badge

红点角标组件,对应 ColorOS 的 COUIHintRedDot,共三种形态:6dp 纯圆点、随位数变宽的 16dp 高数字胶囊,以及数字达到 1000 及以上时的三点省略号。BadgeBox 可将角标锚定在图标右上角,对应 COUIRedDotFrameLayout。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.Badge
import io.github.suqi8.coui.kmp.basic.BadgeBox
import io.github.suqi8.coui.kmp.basic.BadgeDefaults

基本用法

kotlin
Badge()                // 纯圆点
Badge(count = 8)       // 数字胶囊
Badge(count = 1000)    // 三点省略号(1000+)
Badge(stroke = true)   // 白色描边,用于彩色背景

角标形态

纯圆点

count 为 0 或更小(默认值)时,渲染 6dp 纯圆点(COUI POINT_ONLY_MODE):

kotlin
Badge()

数字胶囊

count 在 1..999 之间时,渲染 16dp 高的胶囊,宽度随位数增加(10 以内 16dp,100 以内 20dp,1000 以内 26dp)。数字变化时胶囊宽度以 517ms 缓动,新旧数字同时以 150ms 交叉淡变:

kotlin
var unread by remember { mutableIntStateOf(8) }

Badge(count = unread)

溢出省略号

count 达到 1000 及以上时,渲染 20dp 宽胶囊内的三点省略号(COUI red_dot_more):

kotlin
Badge(count = 1000)

白色描边

stroke = true 会在圆点或胶囊外绘制 1dp 白色描边,用于放在彩色背景上的角标(COUI POINT_ONLY_MODE_STROKE / POINT_NUM_MODE_STROKE):

kotlin
Badge(stroke = true)              // 带描边的圆点
Badge(count = 99, stroke = true)  // 带描边的胶囊

使用 BadgeBox 锚定

BadgeBox 将角标锚定在内容的右上角。overhang 为正时,角标按该距离超出内容右上角并相应扩大布局(COUI 矩形锚点,如图标):

kotlin
BadgeBox(
    badge = { Badge(count = 8) },
    overhang = BadgeDefaults.CountOverhang,
) {
    Icon(
        imageVector = COUIIcons.Settings,
        contentDescription = "Settings",
    )
}

overhang 为负时,角标改为内缩于角内(COUI 圆形锚点,如头像):

kotlin
BadgeBox(
    badge = { Badge() },
    overhang = (-2).dp,
) {
    Image(
        painter = avatarPainter,
        contentDescription = "Avatar",
        modifier = Modifier.size(40.dp).clip(CircleShape),
    )
}

属性

Badge

属性类型说明默认值必需
modifierModifier应用于角标的修饰符Modifier
countInt角标显示的数字,<= 0 时显示纯圆点0
strokeBoolean是否绘制白色描边false
colorsBadgeColors颜色配置BadgeDefaults.badgeColors()
dotDiameterDp纯圆点形态的直径BadgeDefaults.DotDiameter
heightDp数字胶囊形态的高度BadgeDefaults.Height

BadgeBox

属性类型说明默认值必需
badge@Composable () -> Unit要锚定的角标-
modifierModifier应用于布局的修饰符Modifier
overhangDp角标超出内容右上角的距离BadgeDefaults.DotOverhang
content@Composable () -> Unit锚定内容,通常为图标-

BadgeDefaults

常量类型默认值
DotDiameterDp6.dp
HeightDp16.dp
SmallWidthDp16.dp
MediumWidthDp20.dp
LargeWidthDp26.dp
TextSizeDp10.dp
StrokeWidthDp1.dp
EllipsisDotDiameterDp2.dp
EllipsisSpacingDp2.dp
DotOverhangDp2.dp
CountOverhangDp3.dp
ScaleAnimDurationMillisInt520

badgeColors() 工厂

参数类型默认值
containerColorColorCOUI 专用红(浅色 #EB3B2F,深色 #EB493D)
contentColorColorColor.White
strokeColorColorColor.White

行为

  • count <= 0 显示纯圆点;1..9 为 16dp 胶囊,10..99 为 20dp,100..999 为 26dp;1000 及以上为 20dp 胶囊内的三点省略号(COUI red_dot_more)。
  • 数字变化的动画与 COUIHintRedDot 一致:胶囊宽度以 517ms 缓动(COUIMoveEaseInterpolator),新旧数字同时以 150ms 交叉淡变。
  • 数字文本按密度换算为 10dp(sans-serif medium)渲染,与原版一样不受用户字体缩放影响。
  • stroke = true 绘制 1dp 白色描边;圆点形态的红色圆核按描边宽度缩小,胶囊形态的红色填充内缩于白色描边之内。
  • BadgeBoxoverhang 为正时,角标超出内容右上角并相应扩大布局(COUI 矩形锚点);为负时角标内缩于角内(COUI 圆形锚点,如头像)。
  • 若需要 COUIHintRedDot 的显示 / 隐藏缩放动画,可用 AnimatedVisibility 配合 scaleIn / scaleOut,时长取 BadgeDefaults.ScaleAnimDurationMillis

变更日志

基于 Apache-2.0 许可发布