Jetpack Compose - CircularProgressIndicator、LinearProgressIndicator

Compose系列文章,请点原文阅读。原文,是时候学习Compose了!

0、介绍

  • CircularProgressIndicator

CircularProgressIndicator是一个圆形进度指示器,它通过绘制一个从0到360度的弧线来表示进度。它分为有确定进度和没有确定进度的两种指示器。默认情况下进度值之间没有动画,可以使用ProgressIndicatorDefaults.ProgressAnimationSpec作为默认的AnimationSpec。

  • LinearProgressIndicator

LinearProgressIndicator是一个线形进度指示器,它通过绘制一条水平线来表示进度。它分为有确定进度和没有确定进度的两种指示器。默认情况下进度值之间没有动画,可以使用ProgressIndicatorDefaults.ProgressAnimationSpec作为默认的AnimationSpec。

1、属性一览

【目前基于alpha09版本】

  • CircularProgressIndicator函数:
@Composable fun CircularProgressIndicator(
    @FloatRange(0.0, 1.0) progress: Float, 
    modifier: Modifier = Modifier, 
    color: Color = MaterialTheme.colors.primary, 
    strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
): Unit
@Composable fun CircularProgressIndicator(
    modifier: Modifier = Modifier, 
    color: Color = MaterialTheme.colors.primary, 
    strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
): Unit

属性参数含义:

参数含义
modifier: Modifier = Modifier应用于布局的修饰符
progress: Float此进度指示器的进度,其中0.0表示没有进度,1.0表示已完成进度。超出此范围的值将强制使用该范围。
color: Color = MaterialTheme.colors.primary进度指示器的颜色
strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth进度指示器的宽度

对于第一个函数没有progress参数,表明它是一个没有确定进度的指示器,所以显示在页面上是一个无线循环的圆形指示器,见下文示例。

  • LinearProgressIndicator函数
@Composable fun LinearProgressIndicator(
    @FloatRange(0.0, 1.0) progress: Float, 
    modifier: Modifier = Modifier, 
    color: Color = MaterialTheme.colors.primary, 
    backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity)
): Unit
@Composable fun LinearProgressIndicator(
    modifier: Modifier = Modifier, 
    color: Color = MaterialTheme.colors.primary, 
    backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity)
): Unit

属性参数含义:

参数含义
modifier: Modifier = Modifier应用于布局的修饰符
progress: Float此进度指示器的进度,其中0.0表示没有进度,1.0表示已完成进度。超出此范围的值将强制使用该范围。
color: Color = MaterialTheme.colors.primary进度指示器的颜色
backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity)指示器后面的背景颜色,当进度尚未达到整个指示器的区域时可见

2、使用示例

2.1、CircularProgressIndicator 无限循环
@Composable
fun ProgressCircularLoopDemo() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        CircularProgressIndicator()
    }
}

效果如下所示:
在这里插入图片描述

2.1、CircularProgressIndicator按进度变化

我们通过点击按钮,让进度条每次递增10%的进度,目前没有添加动画的实现:

@Composable
fun ProgressCircularDemo() {
    val rememberProgress = remember { mutableStateOf(0.1f) }

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        CircularProgressIndicator(
            progress = rememberProgress.value
        )

        Spacer(Modifier.height(30.dp))
        TextButton(onClick = {
            if (rememberProgress.value < 1f) rememberProgress.value += 0.1f
        }) {
            Text(text = "增加进度")
        }
    }
}

效果如下所示:
在这里插入图片描述

2.3、LinearProgressIndicator无限循环
@Composable
fun ProgressCircularLoopDemo() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        CircularProgressIndicator()
    }
}

效果如下所示:
在这里插入图片描述

2.4、LinearProgressIndicator按进度变化

我们同样通过点击按钮来让进度依次递增10%来实现,代码如下:

@Composable
fun ProgressLinearDemo() {
    val rememberProgress = remember { mutableStateOf(0.1f) }

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        LinearProgressIndicator(
            progress = rememberProgress.value
        )

        Spacer(Modifier.height(30.dp))
        TextButton(onClick = {
            if (rememberProgress.value < 1f) rememberProgress.value += 0.1f
        }) {
            Text(text = "增加进度")
        }
    }
}

效果如下所示:
在这里插入图片描述

2.5、为进度添加动画

关于动画这一块我们还没有研究完整,动画的文章还在整理中,但是我们目前需要快速入门一个动画函数:

@Composable
fun animate(
    target: Float,
    animSpec: AnimationSpec<Float> = defaultAnimation,
    visibilityThreshold: Float = 0.01f,
    endListener: ((Float) -> Unit)? = null
):

第一个参数表示动画的目标值,第二个是用于改变数值的动画,根据官方的描述我们可以使用ProgressIndicatorDefaults.ProgressAnimationSpec,目前就使用这个函数两个参数搭配线性进度指示器,我们来看下代码:

@Composable
fun ProgressLinearDemo() {
    val rememberProgress = remember { mutableStateOf(0.1f) }

    //添加动画
    val animatedProgress = animate(
        target = rememberProgress.value,
        animSpec = ProgressIndicatorDefaults.ProgressAnimationSpec
    )

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        LinearProgressIndicator(
            progress = animatedProgress
        )

        Spacer(Modifier.height(30.dp))
        TextButton(onClick = {
            if (rememberProgress.value < 1f) rememberProgress.value += 0.1f
        }) {
            Text(text = "增加进度")
        }
    }
}

效果如下所示:

在这里插入图片描述
可以看到比之前生硬改变进度的效果柔和了许多,有了一个渐变增加进度的效果。

3、版本更新

  • 暂无

4、未解决问题

基本的进度条效果已经实现了,但是目前相比XML中的进度条还少了第一进度第二进度的概念,这在视频应用中可能比较常见,最底层是视频时长总进度,第二进度是视频缓冲进度,第一进度是当前观看的进度。
但是我们通过查看LinearProgressIndicator的源码可以看到这些都是继承自Canvas实现的,而且我们可以根据源码很简单的就能模拟实现上述功能,大家可以自行尝试下。再往下可以看到线性指示器最终是通过drawLine来实现的,大胆假设下,我们同样也可以通过drawRoundRect来实现圆角的线性进度指示器。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值