最近杂七杂八的工作一堆,遽然发现自己良久没有写Compose了,最近的一篇Compose相关的文章离现在差不多快要两个月了,这么一想可把自己吓一跳,那么长时间了可别把Compose的东西给弄陌生了呀,尤其最近又是ArkTS又是React的,都是声明式的语法又那么挨近,在不写点Compose估计就要不会写了,那么该写点啥呢?之前前前后后整了有十六个Compose的loading动效,发现做动效还挺有意思的,那么这次持续来做点动效吧,但不做loading了,做点进展动效来换换口味,打开IDE,开整~
准备工作
之前网上去搜了一下,这样的动效大多数都很千人一面,基本都是中心一个百分比数字,周围一个圆弧,从一个小圆弧变成一个完好的圆,这样整个动效就完毕了,有差异的也最多便是字体色彩,圆弧色彩,圆弧粗细之类的不相同,可是这样就很单调,咱们这次就来做点有意思的,不相同的动效来看看,首先不管是什么样的作用,咱都需求一些数据来表示进展,这个进展就用下面这段代码来完成
一个状态变量progress
,这个变量便是用来保存当前的进展,而且作为LaunchedEffect
的key,首次启动,LaunchedEffect
会履行它内部的协程block
,block
里边是一个Flow
,Flow
的上游判别当前progress
的巨细是否超过了100,超过了就从头置成0,没有超过的话就延迟200毫秒再emit
个2到下流,下流拿到上游发送过来的数据之后,更新到progress
上,然后从头触发LaunchedEffect
履行新的协程block
,就这样一个简单的改动进展的进程就做好了,后面只需求将progress
传递给每个动效函数就好了,下面来做第一个动效
变大并旋转的圆弧
这个动效是之前在其他当地看到过,也是百分比跟圆弧的组合,可是圆弧除了弧度会变大之外,圆弧本身也会绕着百分比旋转,这边也来用Compose完成一下,因为要展现百分比数字,所以整个布局结构是外层一个Box
,里边是一个Canvas
和一个Text
,Canvas
用来制作圆弧部分,Text
用来显示百分比,整个结构如下
Text
直接展现的便是进展的值progress
,然后将RollingArc
函数在外层Window
函数中调用后的作用就如下所示
然后因为项目用的Compose版本是1.5.1
众所周知,Compose在1.4的版本里边已经给文本组件添加了drawStyle
特点,能够轻松给文本设置上描边作用,完成起来也很简单,只要在Text
组件中设置了drawStyle
特点就好,款式就在里边自界说
上面这段代码便是给Text
增加了一个描边作用,其中边的粗细是3f,笔触设置为StrokeCap.Square
,作用就像下面这样
文本现在就呈现出只有描边,中心是空心的作用,drawStyle
还能够设置其他作用,比方给文本设置虚线作用之类的,但不是本文要点就不说了,大家有爱好能够测验下,咱们持续下一步,现在做好了百分比的跳动动画,然后便是外面的圆弧动画了,这个就要在Canvas
里边运用drawArc
函数来完成,咱们先随意画个圆弧,比方开始视点是0度,弧度巨细是90度,代码如下
这儿画了一个弧度粗细是30f,方位在左上角(0,0)坐标,巨细是100f * 100f的圆弧,大约的样子就像下面这样
现在要挪动这个圆弧,让圆弧的圆心刚好是整个画布的中心,那么圆弧就能绕着中心的百分比数字旋转的了,那么第一步,需求界说几个变量
代表中心点坐标的centerX
与centerY
,以及圆弧半径outRadius
,有了这三个变量,就能够核算出当圆弧圆心在画布中心时分,topLeft
的x,y坐标,代码如下
左上角x坐标便是centerX
减去圆弧半径,y坐标便是centerY
减去圆弧半径,而Size
里边便是传入圆弧的直径,也便是两倍的outRadius
,这个时分圆弧的方位就在画布中心了
接着便是动画部分,先让圆弧绕着中心旋转,这个很简单,让startAngle
的值变成一个循环改动的动画变量就好
然后把start
作为startAngle
的值,圆弧就转起来了
圆弧转起来今后,圆弧的弧度就得跟着传进来的progress
值动态改动了,直到progress
值是100的时分,圆弧的弧度就变成360度,这儿progress
与sweepAngle
的转化联系是这样的
咱们把这个转化联系代入到drawArc
的sweepAngle
里边去,圆弧的弧度也就跟着progress
一同改动了
这儿不知道大家有没有看清,这个弧度改动的进程中有点卡顿,主要原因是咱们sweepAngle
的值改动的时分是从一个值直接到另一个值,没有一个过渡的进程,才会让作用看起来有点卡顿的样子,处理这个问题也很简单,咱们让sweepAngle
也变成一个动画变量就好,运用animateFloatAsState
函数来完成
这儿将progress * 3.6
作为targetValue
值代入到animateFloatAsState
函数里边去,这样就得到了一个sweepDif
的改动动画,咱们将sweepDif
代入到sweepAngle
里去后,再来看下作用
现在sweepAngle
改动的时分卡顿的感觉就不是很明显了,而这个动效也基本完成了,剩下的工作便是美化工作,让百分比字体色彩与圆弧色彩跟着进展的改动有个色彩的过渡改动,要做到这一点的话首先需求一个色彩的数组
这儿创建了一个色彩数组circleColorList
,长度巨细是11,为什么是11呢,因为咱们进展progress
的取值是从0-100,这些数字的十位数是0-10一共有11个,每一个十位数假如要对应一个色彩的话,那么必定的咱们这个数组长度就必须设置为11,然后再运用animateColorAsState
函数创建一个色彩改动的动画
能够看到这边的targetValue
取的便是circleColorList
里边的值,下标是progress/10
,然后再把ringColor
作为咱们圆弧与百分比字体的色彩,整个动效就多了一个色彩切换的作用了
这儿还给色彩加了点突变,最终整个动效就完成了
自界说进展款式
或许这儿会有小伙伴吐槽,你开头不是说圆弧的动效比较单调,看腻了吗,怎么自己反手就做了个圆弧呢?piapia打脸了昂,好吧。。刚开始手有点陌生,所以先做个中规中矩的热热身,接下来就开始做个有意思的,这儿从头再新建个函数
这儿相同创建了中心点坐标centerX
与centerY
,能够从函数名字能够看出,这次要做的动效是要去画线,当然这线不是去调用drawLine
函数去画,而是画的是贝塞尔曲线,咱们都知道画贝塞尔曲线其实便是制作Path
,所以咱们也要去制作Path
,制作很多Path
,所以先创建一个存放Path
的数组
直接创建了一个巨细是100的数组,里边也创建了100个Path
,可是并没有界说详细途径,因为不同的途径所展现出来的作用也都是不相同的,比方咱们这儿要画的曲线是二阶的,二阶曲线的首尾控制点都在一个圆上,第一个控制点比方是在圆的0度方位,那么最终一个控制点则是在相对于第一个点再经过90度的方位,至于中心的控制点,便是在比首尾点地点的圆更大的圆上,方位便是在0和90度之间,其他曲线也都这样的逻辑,仅仅控制点地点的方位的视点呈递加联系,大约的制作思路便是这样,咱们现在就来将这一百个曲线制作出来,因为有两个圆,所以再创建两个变量代表这两个圆的半径
maxRadius
是比较小的圆的半径,outRadius
是较大圆的半径,因为要获取圆上点的坐标,所以再创建两个函数分别去核算坐标的x,y值
两个函数所需求的参数里边,半径与中心点坐标都有了,还缺第三个参数视点,因为Path
数组巨细是100,所以咱们将整个圆周等分为100份,每一个小圆弧跨越的视点都是3.6f,那么一切曲线的第一个控制点就有了
第二个控制点在比较大的圆上,所以半径需求运用outRadius
,视点能够是在第一个点的视点基础上加上随意一个0到90度的值,比方45度,那么第二个点的代码如下
第三个控制点的半径又变成了maxRadius
,视点是在第一个点的基础上加上90,所以完好的贝塞尔曲线的途径的代码如下
现在就能够在Canvas
里边遍历pathList
,将一切曲线制作出来了,制作代码如下
然后咱们就能得到下面这样的图案
现在是将一切曲线都制作出来,假如想要让制作的曲线数量与进展progress
绑定在一同,只需求在遍历时分判别一下下标index
比当前progress
小,满意条件的再去制作就能够了,更改一下代码
这个时分一切曲线都能够去动态制作了,看下作用
接下来在这个基础上再优化一下,咱们给曲线设置个虚线作用,而且透明度让它跟着进展慢慢增加,虚线的话能够经过设置pathEffect
特点去完成,透明度直接用progress/100f
,不过要判别下值,不能超出1f,不然程序就闪退了,更改后的代码如下
这个时分的作用再来看下
像不像一个钢丝球?咱们给这个“钢丝球”染个色,先界说一组色值
然后在制作Path
的当地,用brush
特点替代color
特点将这组色值设置进去
现在的“钢丝球”就变成五颜六色的了
这个动效做到这儿其实能够收工了,可是总感觉哪里还缺陷啥?代码往上翻一翻能够发现这段代码
这是界说曲线途径的代码,其中第二个控制点的方位现在还是固定在距第一个点45度的方位,咱们能够在这个值上下点功夫,比方下标为偶数的点,核算x坐标的视点为45度,核算y轴视点为55度,下标为奇数的则反过来,代码更改下便是下面这样
咱们看看现在作用变成什么样子了
“钢丝球”一会儿变得就有层次感了,假如想要把百分比的文本也显示出来,能够运用drawText
函数,在“钢丝球”中心展现百分比文本,代码如下
详细作用便是下面这样
源码地址
总结
这篇文章里一共做了两个进展动效,一个算是比较务实,实用的,一个则比较笼统,构思元素多一些,不过目的还是为了打破那种故步自封的思路,不一定进展动效只能规划出那种圆环,或者进展条的款式,也能够多发挥想象力,规划出愈加美观,酷炫的进展作用。