Android自定义View实现圆环进度条
作者:汪星没有熊 发布时间:2023-09-20 00:19:13
标签:Android,View,进度条
本文实例为大家分享了Android自定义View实现圆环进度条的具体代码,供大家参考,具体内容如下
效果展示
动画效果
View实现
1.底层圆环是灰色背景
2.上层圆环是红色背景
3.使用动画画一条弧线
View
/**
* 圆环进度条
*/
public class RoundProgressBar extends View {
//绘制矩形区域
private RectF rectF;
//起始角度
private float startAngle;
//扫过角度
private float sweepAngle;
//画笔
private Paint paint;
//默认控件大小
private int defoutSize;
//默认线条宽度
private int defoutLine;
private int strokeWidth;
private PointF pointF = new PointF();
public RoundProgressBar(Context context) {
super(context);
initData();
}
public RoundProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
/**
* 参数初始化
*/
private void initData() {
startAngle = 0;
sweepAngle = 0;
defoutSize = 400;
defoutLine = 20;
strokeWidth = 20;
rectF = new RectF();
//抗锯齿画笔
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GRAY);
paint.setStrokeWidth(defoutLine);
//笔帽样式
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStyle(Paint.Style.STROKE);
}
/**
* xml -----> 提供可绘制位置
*
* @param widthMeasureSpec 宽
* @param heightMeasureSpec 高
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(defoutSize, defoutSize);
}
/**
* 当大小时改变回调
*
* @param w
* @param h
* @param oldw
* @param oldh
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
pointF.x = w >> 1;
pointF.y = h >> 1;
rectF.top = strokeWidth >> 1;
rectF.bottom = h - (strokeWidth >> 1);
rectF.left = strokeWidth >> 1;
rectF.right = w - (strokeWidth >> 1);
}
/**
* 绘制
*
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画布旋转
paint.setColor(Color.GRAY);
canvas.rotate(135, pointF.x, pointF.y);
//绘制圆环
canvas.drawArc(rectF, startAngle, 270, false, paint);
paint.setColor(Color.RED);
canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);
}
public void setProgress(float index) {
//防止数值越界
if (index > 1 || index < 0) {
return;
}
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, index);
valueAnimator.setDuration(3000);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
sweepAngle = (float) animation.getAnimatedValue() * 270;
//重写绘制
invalidate();
}
});
valueAnimator.start();
}
}
最后在Activity中使用setProgress方法赋值进度条的进度来实现效果
progressView.setProgress(0.8f);
来源:https://blog.csdn.net/weixin_45697390/article/details/106364039


猜你喜欢
- idea2020.3.3配置Maven走过的那些坑idea2021最新激活码idea2020.3.3激活码有两种方法,小编在这推荐使用方法一
- 一、APP通过View修改鼠标样式app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法
- 前言解放双手!推荐一款阿里开源的低代码工具,YYDS!之前分享过一些低代码相关的文章,发现大家还是比较感兴趣的。之前在我印象中低代码就是通过
- 本文通过C#程序代码展示如何给PDF文档添加可视化数字签名和不可见数字签名。可视化数字签名,即在PDF文档中的指定页面位置添加签名,包含相关
- 本文实例讲述了Android编程开发之ScrollView嵌套GridView的方法。分享给大家供大家参考,具体如下:前些日子在开发中用到了
- Android 中Volley二次封装并实现网络请求缓存Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过
- 一、什么是SFTP?SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务
- 本节只是介绍实战部分,具体的理论参数,请自行百度。所需工具:linux服务器 Jmeter测试工具 xshell &
- 最近遇到的一个场景,在一个被 @Transactional 注解的方法A中中调用了一个被 @Async 注解标记的方法B,由于方法B 在执行
- PDF文件和图片文件,这是两种完全不一样的格式,可是有的时候这两种格式却是有相互转换的需要,大家在工作中遇到PDF文件转图片文件的问题时是怎
- 首先给大家介绍一文件的上传 实体类import java.sql.Timestamp; /** * * @Decription 文件上传实体
- 本文实例讲述了Java设计模式之抽象工厂模式。分享给大家供大家参考,具体如下:具体工厂类:生产创建某一类具体产品对象。抽象产品类可以使用接口
- 在我们实际开发项目中,经常会遇到一些常量的配置,比如url,暂时不会改变的字段参数,这个时候我们最好是不要直接写死在代码里的,因为这样编写的
- 本文实例讲述了java实现的DES加密算法。分享给大家供大家参考,具体如下:一、DES加密算法介绍1、要求密钥必须是8个字节,即64bit长
- 找入口对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方
- 本文实例为大家分享了java http token的具体代码,供大家参考,具体内容如下package com.monitoring.comm
- 本文实例讲述了C#手工双缓冲技术。分享给大家供大家参考。具体如下:using System;using System.Collections
- 最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了。以下做个记录:首先会用到iTextSharp组件,大家可以去官网下载,同时我也会
- 概述在移动应用开发中,消息推送可以说是一项非常重要的功能,它能够起到提醒或者唤醒用户的作用,同时也是产品运营人员更高效地实现运营目标的重要手
- C# winform 新手实例:点击生成二维码效果图如下:打开exe默认界面部分代码://button点击事件private void bu