Android 自定义view 圆形进度条

news2024/11/25 9:40:57

Android 自定义view 圆形进度条

  • 前言
  • 一、码前分析
  • 二、开码
    • 1.画笔
    • 2.弧度
    • 3.圆弧的位置
    • 4.暴露给外部设置进度条的方法
    • 三、使用
    • 四、完整代码
  • 总结


前言

先来看看效果,大概要实现这么一个圆形的进度条

在这里插入图片描述


一、码前分析

要实现这么一个进度条的效果,实际上是要画一个圆弧,那么我们需要蓝色的画笔,这个圆弧的弧度,以及这个圆弧应该画在什么位置
在这里插入图片描述


二、开码

1.画笔

代码如下(示例):

    private val progressPaint: Paint = Paint().apply {
        color = resources.getColor(R.color.ff1DB0CC)
        style = Paint.Style.STROKE
        strokeWidth = 3f
        isAntiAlias = true
    }

上面的示例创建了一个画笔progressPaint,它的颜色是ff1DB0CC,填充方式是描边,画笔宽度为3f;值得一提的是isAntiAlias ,设置为true时表示打开抗锯齿,使我们的圆弧更为圆滑。

2.弧度

代码如下(示例):

    private var currentProgress: Float = 0f
    private var maxProgress: Float = 15000f
    
val sweepAngle = 360f * currentProgress / maxProgress

上面的代码示例计算了圆弧的弧度
圆弧的弧度 = 360 ° ∗ 进度条现在的进度 / 进度条总进度 . 圆弧的弧度 = 360°* 进度条现在的进度/进度条总进度. 圆弧的弧度=360°进度条现在的进度/进度条总进度.

3.圆弧的位置

代码如下(示例)

 		val center = width / 2f
        val radius = center - progressPaint.strokeWidth / 2f
        val sweepAngle = 360f * currentProgress / maxProgress
        canvas.drawArc(center - radius, center - radius, center + radius, center + radius,-90f, sweepAngle, false, progressPaint)

上面的代码示例计算了圆弧绘制的位置,并通过drawArc方法将圆弧绘制出来。

4.暴露给外部设置进度条的方法

代码如下(示例)

    fun setProgress(progress: Int) {
        currentProgress = progress.toFloat()
        invalidate()
    }

    fun setMaxProgress(max: Int) {
        maxProgress = max.toFloat()
    }

三、使用

直接在xml中使用即可,通过暴露方法自己设置进度

      		 <com.zyf.view.CircularProgressBar
                    android:id="@+id/progress"
                    android:layout_width="113dp"
                    android:layout_height="113dp"
                   />

四、完整代码


class CircularProgressBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    private val progressPaint: Paint = Paint().apply {
        color = resources.getColor(R.color.ff1DB0CC)
        style = Paint.Style.STROKE
        strokeWidth = 3f
        isAntiAlias = true
    }

    private var currentProgress: Float = 0f
    private var maxProgress: Float = 15000f

    override fun onDraw(canvas: Canvas) {
        val center = width / 2f
        val radius = center - progressPaint.strokeWidth / 2f



        val sweepAngle = 360f * currentProgress / maxProgress
        canvas.drawArc(center - radius, center - radius, center + radius, center + radius,
            -90f, sweepAngle, false, progressPaint)


    }

    fun setProgress(progress: Int) {
        currentProgress = progress.toFloat()
        invalidate()
    }

    fun setMaxProgress(max: Int) {
        maxProgress = max.toFloat()
    }
}

总结

本文介绍了如何实现一个圆形进度条的自定义 View,并分析了需要实现的基本要素,包括画笔、弧度和圆弧的位置。最后给出了完整的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精彩再现!LLUG 深圳场成功举办 | 附活动资料下载

导读&#xff1a;9 月 24 日下午&#xff0c;龙蜥社区联合Linux 中国在深圳成功举办LLUG。本文转自Linux 中国&#xff0c;作者 Bestony。 9 月 24 日下午&#xff0c;龙蜥社区联合Linux 中国举办的 LLUG 在热浪滔天的深圳圆满落幕。 &#xff08;图/ 白板上的 “LLUG.sz”由 N…

哇喔,用这个平台制作电子画册,太简单了!

经常在朋友圈里看到可以在线浏览、类似仿真书的电子画册&#xff0c;总觉得这种制作起来很难&#xff0c;后来无意间看到朋友在制作&#xff0c;今天终于知道怎么做了&#xff01; 原来只用一个平台 FLBOOK&#xff01;&#xff01;就能做出来这种效果&#xff0c;像我这种电脑…

C/C++类型转换

目录 一、C语言中的类型转换二、C中的类型转换2.1 C的四种类型转换2.1.1 static_cast2.1.2 reinterpret_cast2.1.3 const_cast2.1.4 dynamic_cast 三、RTTI&#xff08;了解&#xff09;四、特殊的类型转换 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧…

【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战

前言 【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战一、效果展示二、马赛克效果四、应用实例 前言 本文将使用Unity 的ShaderGraph制作一个马赛克的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity S…

2022最新版-李宏毅机器学习深度学习课程-P25 Spacial Transformer Layer

data augmentation/spacial transformer CNN 并不能够处理影像放大缩小,或者是旋转的问题。所以在做影像辨识的时候,往往都要做 Data Augmentation&#xff0c;把你的训练数据截一小块出来放大缩小、把图片旋转&#xff0c;CNN 才会做到好的结果。 有一个架构叫 spacial Tran…

Ubuntu 22.04.3 LTS单机私有化部署sealos desktop

推荐使用奇数台 Master 节点和若干 Node 节点操作系统 :Ubuntu 22.04 LTS内核版本 :5.4 及以上配置推荐 :CPU 4 核 , 内存 8GB, 存储空间 100GB 以上最小配置 :CPU 2 核 , 内存 4GB, 存储空间 60GB 这里采用的Ubuntu 22.04.3 LTS 版本&#xff0c;Ubuntu 20.04.4 LTS这个版本…

iOS——Manager封装网络请求

在之前的项目里&#xff0c;我们都是把网络请求写在viewController的viewDidLoad&#xff0c;而实际中使用的时候并不能这么简单&#xff0c;对于不同的需要&#xff0c;我们需要有不同的网络请求。所以我们可以用单例模式创建一个全局的Manager类&#xff0c;用实例Manager来执…

微信朋友圈的高级玩法!你一定要知道!

我们都知道&#xff0c;朋友圈是一个社交平台&#xff0c;可以让我们和朋友们分享生活中的点滴&#xff0c;看到他们的动态。但你可能不知道&#xff0c;朋友圈其实有很多高级玩法&#xff0c;可以让你的社交体验更加丰富多彩。今天&#xff0c;就让我们一起来看看朋友圈的那些…

协同办公系统OA实施过程中需要注意的细节

随着企业对于高效、便捷的办公方式的需求增加&#xff0c;协同办公系统OA正逐渐成为企业信息化建设的热门选择。然而&#xff0c;协同办公系统OA的实施并非一蹴而就&#xff0c;需要企业在实施过程中注意一系列的细节。 一、规划与需求分析 企业应根据自身的业务需求和发展战略…

天津滨海新区城市轨道交通电能管理系统方案与实施方案

【摘要】&#xff1a;介绍天津滨海新区轨道交通项目建设电能管理系统的系统架构、功能组成和实施方案。在借鉴其他城市轨道交通项目电能管理系统的基础上,结合天津滨海新区轨道交通建设的具体情况&#xff0c;对系统组网方案、测量表计设置原则、与通风空调节能系统和照明节能系…

20231017定时任务

1. 构建定时任务 表达式生成 在线Cron表达式生成器 1.1 启动类 1.2 测试范例 描述: 1,将该类用Component描述,交给spring管理. 2,定时任务方法用Scheduled&#xff0b;cron表达式描述 2. 定时任务的弊端和优化方案 1.假如有一个定时任务,每小时检查关闭超时未支付订单,当10…

螺纹快速接头在卫浴行业中的应用提高产量降低生产成本

螺纹快速接头在卫浴行业主要用于上下水测试和密封性测试&#xff0c;可以快速密封连接待测产品和水管。取代之前的工人手拧编织管六角螺母的方式&#xff0c;方便快捷&#xff0c;密封性好&#xff0c;产品测试更稳定。 卫浴行业产品必须具备很好的密封性&#xff0c;防止在实际…

GeoServer改造Springboot启动四(解决post接口方法无法用@requestbody为入参的请求)

1、修改源码4 解决问题:解决Controller接口post方法(如图 19)无法用@requestbody为入参的 json数据进行请求,用swagger请求示例如图 20,具体错误呈现如图 21。 图 19Controller接口示例 图 20post接口请求示例 图 21post接

CEC2013(MATLAB):​白鲸优化算法(Beluga whale optimization,BWO)​求解CEC2013

一、白鲸优化算法&#xff08;Beluga whale optimization&#xff0c;BWO&#xff09; 白鲸优化算法&#xff08;Beluga whale optimization&#xff0c;BWO&#xff09;由Changting Zhong等人于2022年提出&#xff0c;该算法模拟了白鲸游泳&#xff0c;觅食和“鲸鱼坠落”行为…

Qt绘图 day9

Qt绘图 day9 基本绘图流程 Qt的绘制系统支持在屏幕和打印设备上使用相同的API进行绘制&#xff0c;主要基于QPainter、QPaintDevice和QPaintEngine类。 QPainter&#xff1a;用于执行绘图操作QPaintDevice&#xff1a;用于二维空间的抽象QPainEngine&#xff1a;提供绘图器在不…

低学历可以学python吗?

低学历可以学python吗&#xff1f; 看不到前途&#xff0c;是不是自己对以后工作就业的事情感到比较迷茫呢&#xff1f; 是不知道企业要求哪些知识&#xff0c;想要的是什么样能力的人&#xff1f; 最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据…

Windows 钉钉多开 dingtalkRC版

亲测可用 下载链接&#xff1a; https://dtapp-pub.dingtalk.com/dingtalk-desktop/win_installer/RC/DingTalk_v6.5.20-RC.7229101.exe

基于SpringBoot的医疗预约服务管理系统

基于SpringBootVue的医疗预约服务管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登陆界面 管理员界面 医生界面 会员界面 摘要 基于SpringBoot的…

计算机网络 | 应用层

计算机网络 | 应用层 计算机网络 | 应用层应用层概述网络应用模型客户/服务器模型&#xff08;Client/Server&#xff0c;C/S&#xff09;P2P模型&#xff08;Peer-to-Peer&#xff09; 域名系统&#xff08;DNS&#xff09; 参考视频&#xff1a;王道计算机考研 计算机网络 参…

【Interview】拟牛顿求一个数的平方根

如何求一个数的平方根&#xff1f; - 一点点算法的文章 - 知乎 牛顿迭代法的思路是通过切线方程与x轴的 交点&#xff0c;逐渐迭代收敛到一个数的平方根。 我们要求m的平方根&#xff0c;构造函数 用图1进行简单说明&#xff1a; 初始化选A点&#xff0c;求切线&#xff0c;…