【自定义View】Android圆饼进度条

2024-06-07 20:36

本文主要是介绍【自定义View】Android圆饼进度条,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源码

自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="ArcProgressView"><attr name="android:textSize" /><attr name="bgBorderWidth" format="dimension" /><attr name="defaultContentColor" format="color" /><attr name="bgBorderColor" format="color" /><attr name="progressColor" format="color" /><attr name="android:textColor" /></declare-styleable>
</resources>

View(kotlin)源码

package com.example.testimport android.content.Context
import android.content.res.Resources
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.util.TypedValue
import android.view.View
import kotlin.math.roundToIntclass ArcProgressView : View {constructor(context: Context?) : super(context)constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) {val obtainStyledAttributes =context?.obtainStyledAttributes(attrs, R.styleable.ArcProgressView)obtainStyledAttributes?.let {textSize = it.getDimensionPixelSize(R.styleable.ArcProgressView_android_textSize,textSize)strokeWidth = it.getDimensionPixelSize(R.styleable.ArcProgressView_bgBorderWidth,strokeWidth.roundToInt()).toFloat()defaultContentColor = it.getColor(R.styleable.ArcProgressView_defaultContentColor,defaultContentColor)bgBorderColor =it.getColor(R.styleable.ArcProgressView_bgBorderColor, bgBorderColor)progressColor =it.getColor(R.styleable.ArcProgressView_progressColor, progressColor)textColor =it.getColor(R.styleable.ArcProgressView_android_textColor, textColor)}obtainStyledAttributes?.recycle()}val paint = Paint(Paint.ANTI_ALIAS_FLAG)var strokeWidth = dpToPx(0.5f).toFloat();var textSize = spToPx(10f).roundToInt()var defaultContentColor = Color.parseColor("#FFF7ED")var bgBorderColor = Color.parseColor("#FAD29D")var progressColor = Color.parseColor("#FAD29D")var textColor = Color.parseColor("#FA940F")private var progress: Int = 0set(value) {field = valueinvalidate()}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)drawBackground(canvas)drawProgress(canvas)}private fun dpToPx(dp: Float): Int {return (Resources.getSystem().displayMetrics.density * dp + 0.5f).roundToInt()}private fun spToPx(sp: Float): Float {return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,Resources.getSystem().displayMetrics)}private fun drawBackground(canvas: Canvas) {paint.strokeWidth = strokeWidthpaint.style = Paint.Style.FILLpaint.color = defaultContentColorcanvas.drawOval(0f + strokeWidth / 2,0f + strokeWidth / 2,width.toFloat() - strokeWidth / 2,height.toFloat() - strokeWidth / 2,paint)paint.style = Paint.Style.STROKEpaint.color = bgBorderColorcanvas.drawOval(0f + strokeWidth / 2,0f + strokeWidth / 2,width.toFloat() - strokeWidth / 2,height.toFloat() - strokeWidth / 2,paint)}val textBound = Rect()private fun drawProgress(canvas: Canvas) {paint.style = Paint.Style.FILLpaint.color = progressColorpaint.textSize = textSize.toFloat()val progressStr = "$progress%"paint.getTextBounds(progressStr, 0, progressStr.length, textBound)val halfTextWidth = textBound.width() / 2fval halfTextHeight = textBound.height() / 2fval progressAngle = progress * 3.6fval halfWidth = width.toFloat() / 2fval halfHeight = height.toFloat() / 2fcanvas.drawArc(0f,0f,width.toFloat(),height.toFloat(),270f,progressAngle,true,paint)paint.isFakeBoldText = truepaint.color = textColorpaint.textAlign = Paint.Align.LEFTcanvas.drawText(progressStr,halfWidth - halfTextWidth,halfHeight - halfTextHeight + textBound.height(),paint)}fun updateProgress(progress: Int) {this.progress = progress}}

Activity布局

  <com.example.test.ArcProgressViewandroid:layout_margin="12dp"android:id="@+id/progress"android:textSize="24sp"android:textColor="@color/black"android:layout_width="100dp"android:layout_height="100dp"/>

Activity更新进度

progress ++
runOnUiThread({progressView.updateProgress(progress)
})

效果图

在这里插入图片描述

这篇关于【自定义View】Android圆饼进度条的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040232

相关文章

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

kafka自定义分区器使用详解

《kafka自定义分区器使用详解》本文介绍了如何根据企业需求自定义Kafka分区器,只需实现Partitioner接口并重写partition()方法,示例中,包含cuihaida的数据发送到0号分区... 目录kafka自定义分区器假设现在有一个需求使用分区器的方法总结kafka自定义分区器根据企业需求

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息