新建RoundProgressBar

  1. class RoundProgressBar : View {
  2.  
  3. private val paint = Paint()
  4.  
  5. var max = 100 //最大进度
  6. var progress = 0 //当前进度 取值范围 0-max
  7. set(value) {
  8. field = value
  9. invalidate()//调用该方法后 onDraw会执行
  10. }
  11. var roundColor = Color.GRAY //圆环颜色
  12. var roundProgressColor = Color.YELLOW //圆环进度的颜色
  13. var roundWidth:Float = 16f //圆环的宽度(粗细)
  14.  
  15. constructor(context: Context) : super(context) {
  16. init(null, 0)
  17. }
  18.  
  19. constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
  20. init(attributeSet, 0)
  21. }
  22.  
  23. constructor(context: Context, attributeSet: AttributeSet, defStyle: Int) : super(context, attributeSet, defStyle) {
  24. init(attributeSet, defStyle)
  25. }
  26.  
  27. private fun init(attributeSet: AttributeSet?, defStyle: Int) {
  28. val typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.RoundProgressBar, defStyle, 0)
  29. max = typedArray.getInt(R.styleable.RoundProgressBar_max, 100)
  30. progress = typedArray.getInt(R.styleable.RoundProgressBar_progress, 30)
  31. progress = max(0,min(progress,100))
  32. roundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.GRAY)
  33. roundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor,Color.YELLOW)
  34. roundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth,16f)
  35. typedArray.recycle()
  36. }
  37.  
  38. override fun onDraw(canvas: Canvas?) {
  39. super.onDraw(canvas)
  40. // 获取圆心x坐标 (x=y)
  41. val c = (width / 2).toFloat()
  42. // 圆环的半径
  43. val radius = c - roundWidth / 2
  44.  
  45. paint.color = roundColor //设置颜色
  46. paint.style = Paint.Style.STROKE
  47. paint.strokeWidth = roundWidth //设置宽度
  48. paint.isAntiAlias = true //消除锯齿
  49.  
  50. canvas?.drawCircle(c,c,radius,paint)
  51.  
  52. paint.color = roundProgressColor
  53. paint.style = Paint.Style.STROKE
  54. paint.strokeWidth = roundWidth
  55. paint.isAntiAlias = true
  56.  
  57. val rectF = RectF(c - radius,c - radius,c + radius,c + radius)
  58. canvas?.drawArc(rectF,(-90).toFloat(),(progress * 360 / max).toFloat(),false,paint)
  59. //invalidate()
  60. }
  61.  
  62. }
  1. context.obtainStyledAttributes 用来获取布局文件的所有属性
  1. canvas?.drawCircle(c,c,radius,paint) 根据画笔类型画圆环或者画圆
  1. Paint.Style.STROKE 画圆环 Paint.Style.FILL 画圆 Paint.Style.FILL_AND_STROKE 画圆 直径包括strokeWidth宽度
  1. canvas?.drawArc(矩形对象,起始角度,画的角度,是否包含圆心,paint) 想要包含圆心的 画笔样式不能是Paint.Style.STROKE 才有效果

在res.values下创建attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.  
  4. <declare-styleable name="RoundProgressBar">
  5. <attr name="max" format="integer" />
  6. <attr name="progress" format="integer" />
  7. <attr name="roundColor" format="color" />
  8. <attr name="roundProgressColor" format="color" />
  9. <attr name="roundWidth" format="dimension" />
  10. </declare-styleable>
  11.  
  12. </resources>

后面就可以使用了

  1. <com.chao.myvideo.view.RoundProgressBar
  2. android:layout_width="50dp"
  3. android:layout_height="50dp"
  4. app:progress="0"
  5. app:max="100"
  6. android:layout_gravity="center"/>

android 圆环进度view的更多相关文章

  1. Android 带进度的圆形进度条

    最近项目有个需求,做带进度从下到上的圆形进度条. 网上查了一下资料,发现这篇博客写得不错http://blog.csdn.net/xiaanming/article/details/10298163 ...

  2. Android多种进度条使用详解

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  3. Android loading进度条使用简单总结

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  4. android的进度条使用

    android的进度条 1.实现的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding= ...

  5. android多线程进度条

    多线程实现更新android进度条. 实例教程,详细信息我已经注释   android多线程进度条   01package com.shougao.hello; 02 03import android ...

  6. Android 自己定义View学习(2)

    上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...

  7. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

  8. 1.Android 视图及View绘制分析笔记之setContentView

    自从1983年第一台图形用户界面的个人电脑问世以来,几乎所有的PC操作系统都支持可视化操作,Android也不例外.对于所有Android Developer来说,我们接触最多的控件就是View.通常 ...

  9. 两种CSS3圆环进度条详解

    晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第 ...

随机推荐

  1. 18 12 29 css background

    background属性 属性解释 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个 ...

  2. ping内网服务器

    cat ping.sh#!/bin/baship="192.168.1."lastip=(200201202210211212220221222) #ip列表 可以继续添加 ps ...

  3. JS高级学习笔记(2)之js多线程

    参考大神:Javascript多线程 web worker ---- 6.Web Worker 概述 截图过来: 线程之间的通信 let worker = new Worker(‘js文件路径’) 主 ...

  4. 算概率(dp,数论)

    链接:https://ac.nowcoder.com/acm/contest/3003/C来源:牛客网 题目描述 牛牛刚刚考完了期末,尽管牛牛做答了所有 n 道题目,但他不知道有多少题是正确的. 不过 ...

  5. Bugku 加密(持续更新)

    1.滴答~滴 不多说,摩斯密码解密. 2.聪明的小羊 栅栏密码解密. 3.ok Ook解密 4.这不是摩斯密码 brainfuck解码 5.简单加密 凯撒有两种编码脚本,一种是字母26内循环移位,一种 ...

  6. 201703-1 分蛋糕 Java

    思路: 注意最后如果剩余蛋糕的重量小于k,也算一个人分到 import java.util.Scanner; public class Main { public static void main(S ...

  7. STM32F407的Modbus做为主站与从站通讯

    在调试STM32F407的串口Modbus通讯之前,也使用过Modbus通讯,只不过都是在PLC或则昆仑通态的触摸屏上使用直接调用现成的库里面的模块,驱动就可以,相对于STM32来,使用PLC库里面的 ...

  8. 关于linux下安装mysqlclient报 Failed building wheel for mysqlclient问题

    导入下列依赖包,搞定 sudo apt-get install python3 python-dev python3-dev build-essential libssl-dev libffi-dev ...

  9. mysql not in 或 in 优化

    在MySQL 中,not in 或in 优化思路, 利用left join 来优化,类似如下的查询方式: select id from a where id in (select id from b ...

  10. Vue2.0权限树组件

    项目使用的饿了么的Element-Ui,权限树使用其树形控件: <el-tree :data="data" ></el-tree> 刚开始没有特殊需求,三级 ...