Android自定义带圆点的半圆形进度条

2024-01-22 05:58

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

自定义带圆点的半圆形进度条

仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错位现象,此代码仅供,带圆点的圆形进度条有空研究一下!图片效果在下方,
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;/*** 自定义带圆点的进度条*/
public class HalfProgressBar extends View{private int maxProgress = 100;//设置进度条背景宽度private float progressStrokeWidth = 3;//设置进度条进度宽度private float marxArcStorkeWidth = 6;//设置进度条圆点的宽度private float circularDotWidth=15;/*** 画笔对象的引用*/private Paint paint;public synchronized int getProgress() {return progress;}/*** Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。*  而postInvalidate()在工作者线程中被调用 使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。 * @param progress 传过来的进度*/public void setProgress(int progress) {if (progress < 0) {progress = 0;}if (progress > maxProgress) {progress = maxProgress;}if (progress <= maxProgress) {this.progress = progress;postInvalidate();}}/*** 当前进度*/private int progress = 99;private RectF oval;private int roundProgressColor;private int roundColor;private int circularDotColor;public HalfProgressBar(Context context) {super(context);}public HalfProgressBar(Context context, AttributeSet attrs) {super(context, attrs);paint = new Paint();oval = new RectF();//这是自定义view 必须要写的TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.HalfProgressBar);roundProgressColor = mTypedArray.getColor(R.styleable.HalfProgressBar_roundProgressColor1, Color.YELLOW);roundColor=mTypedArray.getColor(R.styleable.HalfProgressBar_roundColor1, Color.YELLOW);circularDotColor=mTypedArray.getColor(R.styleable.HalfProgressBar_circularDotColor1, Color.YELLOW);}public HalfProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);paint = new Paint();oval = new RectF();TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.HalfProgressBar);roundProgressColor = mTypedArray.getColor(R.styleable.HalfProgressBar_roundProgressColor1, Color.YELLOW);roundColor=mTypedArray.getColor(R.styleable.HalfProgressBar_roundColor1, Color.YELLOW);}@Overrideprotected void onDraw(Canvas canvas) {// TODO 自动生成的方法存根super.onDraw(canvas);float width = getWidth();float height = getHeight();paint.setAntiAlias(false); // 设置画笔为抗锯齿paint.setColor(roundColor); // 设置画笔颜色paint.setStrokeWidth(progressStrokeWidth); // 线宽paint.setStyle(Paint.Style.STROKE);oval.left = marxArcStorkeWidth / 2; // 左上角xoval.top = circularDotWidth; // 左上角yoval.right = width - circularDotWidth / 2; // 左下角xoval.bottom = width - circularDotWidth / 2; // 右下角yfloat bangjing = ((width - circularDotWidth/2) / 2);//半径//调整圆背景的大小canvas.drawArc(oval, 180, 180, false, paint); // 绘制红丝圆圈,即进度条背景//进度条颜色paint.setColor(roundProgressColor);paint.setStrokeWidth(marxArcStorkeWidth);canvas.drawArc(oval, 180, 180 * ((float) progress / (float) maxProgress), false, paint); // 绘制进度圆弧,这里是蓝色//画圆点paint.setColor(circularDotColor);paint.setAntiAlias(true); // 设置画笔为抗锯齿paint.setStyle(Paint.Style.FILL);paint.setStrokeWidth(circularDotWidth);//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式Cap.ROUND,或方形样式Cap.SQUAREpaint.setStrokeCap(Paint.Cap.ROUND);float jindu = ((float) progress * 1.8f);canvas.drawPoint(bangjing - ((float) (Math.sin((Math.PI / (double) 180) * (jindu <= 90 ? 90 - (jindu) : -jindu + 90))) * bangjing),bangjing+circularDotWidth - ((float) (Math.cos((Math.PI / (double) 180) * (double) (jindu <= 90 ? 90 - jindu : -jindu + 90))) * bangjing), paint);}}
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><!--自定义半圆形加载进度条--><declare-styleable name="HalfProgressBar"><attr name="roundColor1" format="color"/><attr name="roundProgressColor1" format="color"/><attr name="circularDotColor1" format="color"/></declare-styleable>
</resources>xml中<com.jyc99.demo.HalfProgressBar
        android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/view"android:layout_centerHorizontal="true"android:layout_marginTop="42dp"android_custom:roundColor1="#fc422b"android_custom:roundProgressColor1="#fa432e"android_custom:circularDotColor1="#246223"/>

由于截图的原因可能看不到圆点 , 大家自己试试调调颜色 调整一下高度宽度
效果图不算太 需要自己试试调调颜色已经高度宽度

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



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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo