compose自定义条形进度条(代码片段)

宿罪 宿罪     2023-02-04     428

关键词:

前言

Compose自定义View其实比View系统更方便简单,比如接下来本文要介绍的就是使用Compose实现View系统中常见的条形进度条。

自定义进度条

Compose material包中提供了CircularProgressIndicator实现View系统中的圆形进度条,因为Compose没有现成的条形进度条,所以我们需要自己定义。实现方式有很多种,本文采用的是Canvas自绘制的方式。

效果图

代码实现比较简单,采用的是绘制叠加图形的方式

@Composable
fun ProgressBar(
    modifier: Modifier,
    progress: Float,
    color: Color,
    cornerRadius: Dp,
    backgroundColor: Color,
) 
    Surface(
        shape = RoundedCornerShape(cornerRadius),
        color = backgroundColor,
        modifier = modifier
            .clip(RoundedCornerShape(cornerRadius)) // 裁剪矩形区域为圆角矩形,将超出圆角矩形的部分绘制去掉
            .drawWithContent 
                drawContent() // 先绘制内容后绘制自定义图形,这样我们绘制的图形将显示在内容区域上方
                val progressWidth = drawContext.size.width * progress
                drawRect(
                    color = color,
                    size = drawContext.size.copy(width = progressWidth),
                )
            ,
        content = 
    )

需要注意的是我们对整个Surface进行了圆角矩形的裁剪,这样将超出圆角矩形背景区域的矩形部分裁剪掉了。这里是一个小技巧,无论是View系统还是Compose可以用图形叠加必要时进行裁剪轻松实现很多不同的效果。

其中Modifier#drawWithContent 方法可以让我们选择在内容前或者内容后进行绘制我们的图形,关键在于我们调用drawContent方法的时机,Compose还提供了drawBehind方法,不过drawBehind方法的内部将在内容区域后面绘制我们的图形,源码中可以体现

/**
 * Draw into a [Canvas] behind the modified content.
 */
fun Modifier.drawBehind(
    onDraw: DrawScope.() -> Unit
) = this.then(
    DrawBackgroundModifier(
        onDraw = onDraw,
        inspectorInfo = debugInspectorInfo 
            name = "drawBehind"
            properties["onDraw"] = onDraw
        
    )
)

private class DrawBackgroundModifier(
    val onDraw: DrawScope.() -> Unit,
    inspectorInfo: InspectorInfo.() -> Unit
) : DrawModifier, InspectorValueInfo(inspectorInfo) 

    override fun ContentDrawScope.draw() 
        onDraw()
        drawContent() // 在绘制图形后绘制内容,也就是我们绘制的图形会显示在内容区域之后(下方)
    

    override fun equals(other: Any?): Boolean 
        if (this === other) return true
        if (other !is DrawBackgroundModifier) return false

        return onDraw == other.onDraw
    

    override fun hashCode(): Int 
        return onDraw.hashCode()
    

使用示例

ProgressBar(
   modifier = Modifier
        .fillMaxWidth() // 指定进度条宽度
        .height(6.dp), // 指定进度条高度
    progress = 0.3f,
    color = Color.Red,
    cornerRadius = 3.dp, 
    backgroundColor = Color.Gray
)

以上进度条组件已经用于个人基于Compose开发的Billbook记账软件中。Billbook已经在酷安市场上线,下载地址:https://www.coolapk.com/apk/295644,有兴趣的同学欢迎下载Billbook记账软件体验并吐槽哈~,后续将分享更多关于Compose和Billbook记账软件开发使用到的技术,有关Compose的问题大家也可以在博客下方留言,将在第一时间回复。

进度条实际效果

compose自定义条形进度条(代码片段)

前言Compose自定义View其实比View系统更方便简单,比如接下来本文要介绍的就是使用Compose实现View系统中常见的条形进度条。自定义进度条Composematerial包中提供了CircularProgressIndicator实现View系统中的圆形进度条,因为Compose没... 查看详情

scss自定义进度条(代码片段)

查看详情

sap自定义进度条(代码片段)

1*&---------------------------------------------------------------------*2*&ReportZCHENH0283*&4*&---------------------------------------------------------------------*5*&6*&7*& 查看详情

xml自定义进度条圆和水平(代码片段)

查看详情

自定义圆环形进度条实现(代码片段)

...一下效果图:功能有:圆环的颜色和进度可以自定义;中间文字可以自定义;可以自定义圆环的宽度;可以设置底部文字(文字内容、大小和textSt 查看详情

ycprogress自定义百分比进度条(代码片段)

...用start开始倒计时,也可以调用stop暂停倒计时,也可以自定义设置进度仿杀毒类型百分比进度条支持设置多种类型,比如设 查看详情

composecanvas自定义圆形进度条(代码片段)

@ComposablefunCircleRing(boxWidthDp:Int,viewModel:TaskViewModel)Canvas(modifier=Modifier.size(boxWidthDp.dp),onDraw=valstrokWidth=30F//灰色背景drawArc(Color(0,0,0,15),startAngle=160f,s 查看详情

qt编写自定义控件14-环形进度条(代码片段)

前言环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即当前... 查看详情

仿字节颜色自定义android进度条(代码片段)

效果展示代码实现第一步:编写自定义属性 res/values/attrs.xml<?xmlversion="1.0"encoding="utf-8"?><resources><declare-styleablename="MyLoadingView"><attrname="loading_color_one"format="color"/> 查看详情

酷炫进度条自定义seekbar(代码片段)

前些天一同学给了我一个ui图,是这样子的:需求:1、看了ui图可以知道这类似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值;4、并且圆形进度... 查看详情

自定义view-滑动进度条(代码片段)

好久没有写文章啦。记录一下此时的心情,哈哈。先上效果图:布局样式:<declare-styleablename="SlidingScaleBarView"><!--刻度文字的大小--><attrname="scaleTextSize"format="dimensi 查看详情

自定义view-滑动进度条(代码片段)

好久没有写文章啦。记录一下此时的心情,哈哈。先上效果图:布局样式:<declare-styleablename="SlidingScaleBarView"><!--刻度文字的大小--><attrname="scaleTextSize"format="dimensi 查看详情

自定义圆环形进度条实现(代码片段)

...一下效果图:功能有:圆环的颜色和进度可以自定义;中间文字可以自定义;可以自定义圆环的宽度;可以设置底部文字(文字内容、大小和textStyle);提供设置进度的接口;可以设置进度的最大值&... 查看详情

android自定义控件篇圆形进度条(代码片段)

一、效果图二、代码逻辑/***funcation:圆形进度条控件*/publicclassCircleProgressViewextendsViewprivatePaintmBackPaint,mProgPaint;//绘制画笔privateRectFmRectF;//绘制区域privateint[]mColorArray;//圆环渐变色privateintmProgress;//圆环进度(0-100)publicCircleProgressView(Co... 查看详情

qt编写自定义控件13-多态进度条(代码片段)

前言多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做多态进度条,应用场景是,某种任务有三... 查看详情

codepush自定义更新弹框及下载进度条(代码片段)

CodePush热更新之自定义更新弹框及下载进度先来几张弹框效果图非强制更新场景image强制更新场景image更新包下载进度效果image核心代码这里的热更新Modal框,是封装成一个功能独立的组件来使用的,需不需要更新以及是否为强制... 查看详情

android自定义圆弧进度条(代码片段)

...到合适,干脆就自己写了一个,顺便复习一下自定义View,下面是具体的实现。先看一下效果这里的话我只做一个进度条 查看详情

android自定义圆弧进度条(代码片段)

...到合适,干脆就自己写了一个,顺便复习一下自定义View,下面是具体的实现。先看一下效果这里的话我只做一个进度条࿰ 查看详情