跳转到内容

ProgressIndicator

ProgressIndicator 是 COUI 中的进度指示组件,用于展示操作的进度状态。提供了线性进度条、环形进度条、无限旋转指示器和旋转加载指示器四种样式,适用于不同场景下的加载和进度展示需求。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.LinearProgressIndicator // 线性进度条
import io.github.suqi8.coui.kmp.basic.CircularProgressIndicator // 环形进度条
import io.github.suqi8.coui.kmp.basic.InfiniteProgressIndicator // 无限旋转指示器
import io.github.suqi8.coui.kmp.basic.RotatingProgressIndicator // 旋转加载指示器

基本用法

线性进度条

线性进度条可用于展示操作的进度:

kotlin
// 确定进度的线性进度条
var progress by remember { mutableStateOf(0.3f) }

LinearProgressIndicator(progress = progress)
kotlin
// 不确定进度的线性进度条
LinearProgressIndicator()

环形进度条

环形进度条适用于需要节省空间的场景:

kotlin
// 确定进度的环形进度条
var progress by remember { mutableStateOf(0.7f) }

CircularProgressIndicator(progress = progress)
kotlin
// 不确定进度的环形进度条
CircularProgressIndicator()

无限旋转指示器

无限旋转指示器适用于无法确定操作时长的场景,默认使用主题强调色着色,与 ColorOS「正在刷新…」的旋转指示器一致:

kotlin
InfiniteProgressIndicator()

旋转加载指示器

RotatingProgressIndicator 是 ColorOS 系统默认的不确定态加载指示器:一段没有背景圆环的裸圆弧,端点为平头(butt cap),在 1250 ms 的一个周期内旋转两整圈,同时弧长在 273.6° 与 50.4° 之间脉动。它直接移植自 Theme.COUI 通过 couiRotatingSpinnerJsonName 属性绑定的 coui_rotating_loading.json 资源,用单个 drawArc 实现,因此不需要引入 Lottie 运行时。

kotlin
RotatingProgressIndicator()

它提供默认(26dp)和小号(16dp)两档尺寸,分别对应 coui_lottie_loading_view_large_*coui_lottie_loading_view_small_*

kotlin
// 小号旋转加载指示器
RotatingProgressIndicator(
    size = ProgressIndicatorDefaults.SmallRotatingProgressIndicatorSize,
    ringDiameter = ProgressIndicatorDefaults.SmallRotatingProgressIndicatorRingDiameter,
    strokeWidth = ProgressIndicatorDefaults.SmallRotatingProgressIndicatorStrokeWidth
)

尺寸规格

环形与无限旋转指示器提供中号(默认)和大号两种规格,定义在 ProgressIndicatorDefaults 中:

kotlin
// Large circular progress indicator
CircularProgressIndicator(
    size = ProgressIndicatorDefaults.LargeCircularProgressIndicatorSize,
    strokeWidth = ProgressIndicatorDefaults.LargeCircularProgressIndicatorStrokeWidth
)

// Large infinite progress indicator
InfiniteProgressIndicator(
    size = ProgressIndicatorDefaults.LargeInfiniteProgressIndicatorSize,
    strokeWidth = ProgressIndicatorDefaults.LargeInfiniteProgressIndicatorStrokeWidth
)

组件状态

所有进度指示器组件都支持确定进度和不确定进度两种状态:

确定进度状态

当提供具体的进度值(0.0-1.0之间的浮点数)时,进度指示器会显示确切的进度:

kotlin
var progress by remember { mutableStateOf(0.6f) }

LinearProgressIndicator(progress = progress)
CircularProgressIndicator(progress = progress)

不确定进度状态

当进度值为 null 时,进度指示器会显示动画效果,表示操作正在进行但无法确定具体进度:

kotlin
LinearProgressIndicator(progress = null)
CircularProgressIndicator(progress = null)

属性

LinearProgressIndicator 属性

属性名类型说明默认值是否必须
modifierModifier应用于进度条的修饰符Modifier
progressFloat?当前进度值,null表示不确定状态null
colorsProgressIndicatorColors进度条的颜色配置ProgressIndicatorDefaults.progressIndicatorColors()
heightDp进度条的高度ProgressIndicatorDefaults.DefaultLinearProgressIndicatorHeight

CircularProgressIndicator 属性

属性名类型说明默认值是否必须
modifierModifier应用于进度条的修饰符Modifier
progressFloat?当前进度值,null表示不确定状态null
colorsProgressIndicatorColors进度条的颜色配置ProgressIndicatorDefaults.circularProgressIndicatorColors()
strokeWidthDp环形进度条的描边宽度ProgressIndicatorDefaults.DefaultCircularProgressIndicatorStrokeWidth
sizeDp环形进度条的大小ProgressIndicatorDefaults.DefaultCircularProgressIndicatorSize

InfiniteProgressIndicator 属性

属性名类型说明默认值是否必须
modifierModifier应用于进度条的修饰符Modifier
colorColor圆弧的颜色COUITheme.colorScheme.primary
sizeDp进度指示器的大小ProgressIndicatorDefaults.DefaultInfiniteProgressIndicatorSize
strokeWidthDp圆弧的描边宽度ProgressIndicatorDefaults.DefaultInfiniteProgressIndicatorStrokeWidth

RotatingProgressIndicator 属性

属性名类型说明默认值是否必须
modifierModifier应用于指示器的修饰符Modifier
colorColor圆弧的颜色COUITheme.colorScheme.onSurfaceContainer
sizeDp指示器方形视图框的大小ProgressIndicatorDefaults.DefaultRotatingProgressIndicatorSize
ringDiameterDp圆弧描边中心线的直径ProgressIndicatorDefaults.DefaultRotatingProgressIndicatorRingDiameter
strokeWidthDp圆弧的描边宽度ProgressIndicatorDefaults.DefaultRotatingProgressIndicatorStrokeWidth

ProgressIndicatorDefaults 对象

ProgressIndicatorDefaults 对象提供了进度指示器组件的默认值和颜色配置。

常量

常量名类型默认值说明
DefaultLinearProgressIndicatorHeightDp4.dp线性进度条的默认高度
DefaultCircularProgressIndicatorStrokeWidthDp3.dp环形进度条的默认描边宽度
DefaultCircularProgressIndicatorSizeDp30.dp环形进度条的默认大小
DefaultInfiniteProgressIndicatorStrokeWidthDp2.67.dp无限指示器的默认描边宽度
DefaultInfiniteProgressIndicatorSizeDp18.dp无限指示器的默认大小
LargeCircularProgressIndicatorStrokeWidthDp5.dp大号环形进度条的描边宽度
LargeCircularProgressIndicatorSizeDp40.dp大号环形进度条的大小
LargeInfiniteProgressIndicatorStrokeWidthDp3.33.dp大号无限指示器的描边宽度
LargeInfiniteProgressIndicatorSizeDp26.dp大号无限指示器的大小
DefaultRotatingProgressIndicatorSizeDp26.dp旋转指示器默认视图框大小
DefaultRotatingProgressIndicatorRingDiameterDp24.14.dp旋转指示器默认圆环直径
DefaultRotatingProgressIndicatorStrokeWidthDp1.857.dp旋转指示器默认描边宽度
SmallRotatingProgressIndicatorSizeDp16.dp小号旋转指示器视图框大小
SmallRotatingProgressIndicatorRingDiameterDp12.68.dp小号旋转指示器圆环直径
SmallRotatingProgressIndicatorStrokeWidthDp1.811.dp小号旋转指示器描边宽度
MaxRotatingProgressIndicatorSizeDp40.dp旋转指示器支持的最大尺寸

方法

方法名类型说明
progressIndicatorColors()ProgressIndicatorColors创建线性进度指示器的默认颜色配置
circularProgressIndicatorColors()ProgressIndicatorColors创建环形进度指示器的默认颜色配置

ProgressIndicatorColors 类

属性名类型说明
foregroundColorColor进度指示器的前景色
disabledForegroundColorColor禁用状态时进度指示器的前景色
backgroundColorColor进度指示器的背景色

进阶用法

自定义颜色的线性进度条

kotlin
var progress by remember { mutableStateOf(0.4f) }

LinearProgressIndicator(
    progress = progress,
    colors = ProgressIndicatorDefaults.progressIndicatorColors(
        foregroundColor = Color.Red,
        backgroundColor = Color.LightGray
    )
)

调整大小的环形进度条

kotlin
var progress by remember { mutableStateOf(0.75f) }

CircularProgressIndicator(
    progress = progress,
    size = 50.dp,
    strokeWidth = 6.dp
)

结合按钮使用的加载状态

kotlin
var isLoading by remember { mutableStateOf(false) }
val scope = rememberCoroutineScope()

Button(
    onClick = {
        isLoading = true
        // 模拟操作
        scope.launch {
            delay(2000)
            isLoading = false
        }
    },
    enabled = !isLoading
) {
     AnimatedVisibility(
        visible = isLoading
    ) {
        CircularProgressIndicator(
            modifier = Modifier
                .padding(end = 8.dp),
            size = 20.dp,
            strokeWidth = 4.dp
        )
    }
    Text("提交")
}

自定义无限旋转指示器

kotlin
InfiniteProgressIndicator(
    color = COUITheme.colorScheme.primary,
    size = 40.dp,
    strokeWidth = 3.dp
)

结合卡片使用的加载状态

kotlin
var isLoading by remember { mutableStateOf(true) }

Card(
    modifier = Modifier
        .fillMaxWidth()
        .height(200.dp)
        .padding(16.dp)
) {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        if (isLoading) {
            Column(
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                CircularProgressIndicator()
                Spacer(modifier = Modifier.height(16.dp))
                Text("加载中...")
            }
        } else {
            Text("内容已加载")
        }
    }
}
// 控制加载状态
LaunchedEffect(Unit) {
    delay(3000)
    isLoading = false
}

变更日志

基于 Apache-2.0 许可发布