美文网首页
2019-12-23 圆形进度条自定义

2019-12-23 圆形进度条自定义

作者: Yangxy_Lazy | 来源:发表于2019-12-23 19:07 被阅读0次

/**
 * Created by yangxy on 2018/9/28.
 */
class CircleStudyBar @JvmOverloads constructor(
        private var mContext: Context, private var attrs: AttributeSet? = null, private var defStyleAttr: Int = 0) : View(mContext, attrs, defStyleAttr) {

    private var totalPaint: Paint? = null
    private var progressPaint: Paint? = null
    private var mWidth: Float = 0f
    private var mHeight: Float = 0f
    private var rectF: RectF? = null
    private var progress: Float = 0f
    private var targetProgress: Float = 0f
    private var totalColor: Int = 0
    private var progressColor: Int = 0


    init {
        initAttrs()
        initPaint()
    }

    private fun initAttrs() {
        val typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.CircleStudyBar)
        totalColor = typedArray.getColor(R.styleable.CircleStudyBar_totalBgColor, resources.getColor(R.color.color_value_1a000000))
        progressColor = typedArray.getColor(R.styleable.CircleStudyBar_progressColor, resources.getColor(R.color.color_value_ff7767))
        typedArray.recycle()
    }

    private fun initPaint() {
        totalPaint = Paint(Paint.ANTI_ALIAS_FLAG)
        totalPaint?.strokeWidth = Utils.dip2px(context, 3f)
        totalPaint?.color = totalColor
        totalPaint?.style = Paint.Style.STROKE

        progressPaint = Paint(Paint.ANTI_ALIAS_FLAG)
        progressPaint?.strokeWidth = Utils.dip2px(context, 3f)
        progressPaint?.color = progressColor

        progressPaint?.style = Paint.Style.STROKE
        progressPaint?.strokeCap = Paint.Cap.ROUND
    }


    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        mWidth = measuredWidth.toFloat()
        mHeight = measuredHeight.toFloat()
        rectF = RectF(Utils.dip2px(context, 6f),
                Utils.dip2px(context, 6f),
                mWidth - Utils.dip2px(context, 6f),
                mHeight - Utils.dip2px(context, 6f))
        drawTotalCircle(canvas)
        drawProgressCircle(canvas)
    }

    /**
     * 画总的背景圆
     */
    private fun drawTotalCircle(canvas: Canvas?) {
        canvas?.drawArc(rectF, 0f, 360f, false, totalPaint)
    }

    /**
     * 画进度条的圆
     */
    private fun drawProgressCircle(canvas: Canvas?) {
        canvas?.drawArc(rectF, -90f, 360f * progress, false, progressPaint)
    }

    private fun setProgress(progress: Float) {
        this.progress = progress
        postInvalidate()
    }

    fun startAnimate(currentCourse: Int, totalCourse: Int) {
        this.targetProgress = currentCourse.toFloat() / totalCourse
        val animator = ValueAnimator.ofObject(FloatEvaluator(), 0, targetProgress)
        animator.addUpdateListener {
            val value: Float = it.animatedValue.toString().toFloat()
            setProgress(value)
        }
        animator.interpolator = LinearInterpolator()
        animator.duration = 2000
        animator.start()
    }
}

相关文章

网友评论

      本文标题:2019-12-23 圆形进度条自定义

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