跳转到内容

ProgressIndicator

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

引入

kotlin
import top.yukonga.miuix.kmp.basic.LinearProgressIndicator // 线性进度条
import top.yukonga.miuix.kmp.basic.CircularProgressIndicator // 环形进度条
import top.yukonga.miuix.kmp.basic.InfiniteProgressIndicator // 无限旋转指示器

基本用法

线性进度条

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

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()

无限旋转指示器

无限旋转指示器适用于无法确定操作时长的场景:

kotlin
InfiniteProgressIndicator()

组件状态

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

确定进度状态

当提供具体的进度值(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 属性

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

CircularProgressIndicator 属性

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

InfiniteProgressIndicator 属性

属性名类型说明默认值是否必须
modifierModifier应用于进度条的修饰符Modifier
colorColor进度指示器的颜色Color.Gray
sizeDp进度指示器的大小ProgressIndicatorDefaults.DefaultInfiniteProgressIndicatorSize
strokeWidthDp环形轨道的描边宽度ProgressIndicatorDefaults.DefaultInfiniteProgressIndicatorStrokeWidth
orbitingDotSizeDp环绕点的大小ProgressIndicatorDefaults.DefaultInfiniteProgressIndicatorOrbitingDotSize

ProgressIndicatorDefaults 对象

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

常量

常量名类型默认值说明
DefaultLinearProgressIndicatorHeightDp6.dp线性进度条的默认高度
DefaultCircularProgressIndicatorStrokeWidthDp4.dp环形进度条的默认描边宽度
DefaultCircularProgressIndicatorSizeDp30.dp环形进度条的默认大小
DefaultInfiniteProgressIndicatorStrokeWidthDp2.dp无限指示器的默认描边宽度
DefaultInfiniteProgressIndicatorOrbitingDotSizeDp2.dp无限指示器默认环绕点大小
DefaultInfiniteProgressIndicatorSizeDp20.dp无限指示器的默认大小

方法

方法名类型说明
progressIndicatorColors()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 = MiuixTheme.colorScheme.primary,
    size = 40.dp,
    strokeWidth = 3.dp,
    orbitingDotSize = 4.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 许可发布