美文网首页
Android自定义View之圆形渐变色进度条

Android自定义View之圆形渐变色进度条

作者: 寻水的鱼Chock | 来源:发表于2023-08-01 17:41 被阅读0次

    效果

    圆形渐变色进度条

    源码

    class CircleProgress @JvmOverloads constructor(
        context: Context?,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : View(context, attrs, defStyleAttr) {
    
        private val mPaint: Paint = Paint()
        private val mRectF = RectF()
        private val mRect = Rect()
        val mTextPaint: Paint = Paint()
    
        init {
            mPaint.isAntiAlias = true
            mPaint.style = Paint.Style.STROKE
            mTextPaint.isAntiAlias = true
            mTextPaint.strokeWidth = 0f
            mTextPaint.textSize = 50f
            mTextPaint.color = Color.WHITE
            mTextPaint.isFakeBoldText = true
        }
    
    
        var textShow = false
        var textCallback: ((Int) -> String) = { "${it}%" }
        var circleSolidColor = Color.parseColor("#373737")
        var arcWidth = 15f //圆弧(也可以说是圆环)的宽度
        var maxValue = 100//最大值
        var progressValue = 0
            set(value) {
                if (field == value) {
                    return
                }
                field = value
                invalidate()
            }
        var mCircleShader: Shader? = null
        private val mDefaultShader by lazy {
            LinearGradient(
                width.toFloat(), 0f, 0f, height.toFloat(), intArrayOf(
                    Color.parseColor("#FFCEFFEB"),
                    Color.parseColor("#FF9DA9FF"),
                    Color.parseColor("#FF9DA9FF"),
                    Color.parseColor("#FFE9B5FF")
                ), floatArrayOf(0f, 0.4f, 0.7f, 1f), Shader.TileMode.CLAMP
            )
        }
    
        override fun onDraw(canvas: Canvas) {
            super.onDraw(canvas)
            //绘制圆形
            //设置圆弧的宽度(圆环的宽度)
            mPaint.shader = null
            mPaint.style = Paint.Style.STROKE
            mPaint.strokeWidth = arcWidth
            mPaint.color = circleSolidColor
            //大圆的半径
            val bigCircleRadius = width.toFloat() / 2
            //小圆的半径
            val smallCircleRadius = bigCircleRadius - arcWidth
            //绘制小圆
            canvas.drawCircle(bigCircleRadius, bigCircleRadius, smallCircleRadius, mPaint)
            mPaint.shader = mCircleShader ?: mDefaultShader
            if (progressValue != 100) mPaint.strokeCap = Paint.Cap.ROUND
            mRectF.set(arcWidth, arcWidth, width - arcWidth, width - arcWidth)
            //绘制圆弧
            canvas.drawArc(mRectF, 270f, (progressValue * 362 / maxValue).toFloat(), false, mPaint)
            if (textShow) {
                val txt = textCallback.invoke(progressValue * 100 / maxValue)
                mTextPaint.getTextBounds(txt, 0, txt.length, mRect)
                canvas.drawText(
                    txt,
                    bigCircleRadius - mRect.width() / 2,
                    bigCircleRadius + mRect.height() / 2,
                    mTextPaint
                )
            }
        }
    }
    

    使用示例

    binding.cps.textShow = true
    val va = ValueAnimator.ofInt(0, 100)
    va.addUpdateListener {
        binding.cps.progressValue = it.animatedValue as Int
    }
    va.duration = 5000
    va.startDelay = 1000
    va.repeatCount = -1
    va.repeatMode = ValueAnimator.RESTART
    va.start()
    



    如果本文对你有帮助就点个赞支持下吧~~~

    相关文章

      网友评论

          本文标题:Android自定义View之圆形渐变色进度条

          本文链接:https://www.haomeiwen.com/subject/ivjepdtx.html