zoukankan      html  css  js  c++  java
  • android 圆环进度view

    新建RoundProgressBar

    class RoundProgressBar : View {
    
        private val paint = Paint()
    
        var max = 100      //最大进度
        var progress = 0   //当前进度   取值范围 0-max
            set(value) {
                field = value
                invalidate()//调用该方法后  onDraw会执行
            }
        var roundColor = Color.GRAY //圆环颜色
        var roundProgressColor = Color.YELLOW  //圆环进度的颜色
        var roundWidth:Float = 16f    //圆环的宽度(粗细)
    
    
        constructor(context: Context) : super(context) {
            init(null, 0)
        }
    
        constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
            init(attributeSet, 0)
        }
    
        constructor(context: Context, attributeSet: AttributeSet, defStyle: Int) : super(context, attributeSet, defStyle) {
            init(attributeSet, defStyle)
        }
    
        private fun init(attributeSet: AttributeSet?, defStyle: Int) {
            val typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.RoundProgressBar, defStyle, 0)
            max = typedArray.getInt(R.styleable.RoundProgressBar_max, 100)
            progress = typedArray.getInt(R.styleable.RoundProgressBar_progress, 30)
            progress = max(0,min(progress,100))
            roundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.GRAY)
            roundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor,Color.YELLOW)
            roundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth,16f)
            typedArray.recycle()
        }
    
        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)
            // 获取圆心x坐标  (x=y)
            val c = (width / 2).toFloat()
            // 圆环的半径
            val radius = c - roundWidth / 2
    
            paint.color = roundColor  //设置颜色
            paint.style = Paint.Style.STROKE
            paint.strokeWidth = roundWidth //设置宽度
            paint.isAntiAlias = true   //消除锯齿
    
            canvas?.drawCircle(c,c,radius,paint)
    
            paint.color = roundProgressColor
            paint.style = Paint.Style.STROKE
            paint.strokeWidth = roundWidth
            paint.isAntiAlias = true
    
            val rectF = RectF(c - radius,c - radius,c + radius,c + radius)
            canvas?.drawArc(rectF,(-90).toFloat(),(progress * 360 / max).toFloat(),false,paint)
            //invalidate()
        }
    
    
    }
    context.obtainStyledAttributes 用来获取布局文件的所有属性
    canvas?.drawCircle(c,c,radius,paint) 根据画笔类型画圆环或者画圆
    Paint.Style.STROKE 画圆环  Paint.Style.FILL 画圆  Paint.Style.FILL_AND_STROKE 画圆 直径包括strokeWidth宽度
    canvas?.drawArc(矩形对象,起始角度,画的角度,是否包含圆心,paint) 想要包含圆心的 画笔样式不能是Paint.Style.STROKE 才有效果 

    在res.values下创建attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <declare-styleable name="RoundProgressBar">
            <attr name="max" format="integer" />
            <attr name="progress" format="integer" />
            <attr name="roundColor" format="color" />
            <attr name="roundProgressColor" format="color" />
            <attr name="roundWidth" format="dimension" />
        </declare-styleable>
    
    </resources>

    后面就可以使用了

    <com.chao.myvideo.view.RoundProgressBar
            android:layout_width="50dp"
            android:layout_height="50dp"
            app:progress="0"
            app:max="100"
            android:layout_gravity="center"/>
  • 相关阅读:
    [LeetCode] 461. Hamming Distance
    [LeetCode] 1503. Last Moment Before All Ants Fall Out of a Plank
    [LeetCode] 271. Encode and Decode Strings
    [LeetCode] 38. Count and Say
    SVN安装及基本操作(图文教程)(超级详细)
    解决ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061)问题
    雪花算法的原理和实现Java
    XML、XML约束、XML解析、常用的xml解析器(DOM4J)、XPATH
    XML解析之SAX方式解析xml文件
    Javascript面试题
  • 原文地址:https://www.cnblogs.com/rchao/p/11226828.html
Copyright © 2011-2022 走看看