Android自定义控件之圆形进度条Android自定义控件之-圆形进度条
时间:2022-06-01
本文章向大家介绍Android自定义控件之圆形进度条Android自定义控件之-圆形进度条,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Android自定义控件之-圆形进度条
先上图:
填充的
环形的
贴代码不废话:
** CircleProgressBar.java **
package com.xiaolei.xiaoui;
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;
/**
* Created by xiaolei on 2017/3/23.
*/
public class CircleProgressBar extends View
{
private int height;
private int width;
private Paint mPaint;
private int strokeWidth = 5;//线条宽度
private RectF rectF;
private int normalColor = Color.parseColor("#A5A5A5");//普通的颜色
private int progressColor = Color.parseColor("#FA9025");//已经走了的进度条颜色
private int textColor = normalColor;//文字颜色
private float textSize = 20;//文字大小
private int progress = 0;//进度条
private String centerText = "100%";//中心填充文字
private Paint fontPaint = null;
private Paint.Style progress_style = Paint.Style.STROKE;//填充式还是环形式
public CircleProgressBar(Context context)
{
this(context, null);
}
public CircleProgressBar(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);
textSize = array.getDimension(R.styleable.CircleProgressBar_text_size,textSize);
textColor = array.getColor(R.styleable.CircleProgressBar_text_color,textColor);
centerText = array.getString(R.styleable.CircleProgressBar_text)==null?centerText:array.getString(R.styleable.CircleProgressBar_text);
strokeWidth = array.getInteger(R.styleable.CircleProgressBar_stroke_width,strokeWidth);
normalColor = array.getColor(R.styleable.CircleProgressBar_normal_color,normalColor);
progressColor = array.getColor(R.styleable.CircleProgressBar_progress_color,progressColor);
progress = array.getInt(R.styleable.CircleProgressBar_progress,progress);
progress_style = array.getInt(R.styleable.CircleProgressBar_progress_style,0)==0?Paint.Style.STROKE:Paint.Style.FILL;
array.recycle();
initPaint();
}
// 2.初始化画笔
private void initPaint()
{
mPaint = new Paint();
mPaint.setColor(normalColor); //设置画笔颜色
mPaint.setAntiAlias(true);
mPaint.setStyle(progress_style); //设置画笔模式为描边
mPaint.setStrokeWidth(strokeWidth); //设置画笔宽度为10px
fontPaint = new Paint();
fontPaint.setTextSize(textSize);
fontPaint.setAntiAlias(true);
fontPaint.setColor(textColor);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
height = MeasureSpec.getSize(heightMeasureSpec);
width = MeasureSpec.getSize(widthMeasureSpec);
if (height > width)//高大于宽的情况
{
rectF = new RectF(strokeWidth, (height / 2 - width / 2) + strokeWidth, width - strokeWidth, (height / 2 + width / 2) - strokeWidth);
} else if (width > height)//宽大于高的情况
{
rectF = new RectF((width / 2 - height / 2) + strokeWidth, strokeWidth, (width / 2 + height / 2) - strokeWidth, height - strokeWidth);
} else//宽等于高的情况
{
rectF = new RectF(strokeWidth, strokeWidth, width - strokeWidth, height - strokeWidth);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
Paint.FontMetrics fontMetrics = null;
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
mPaint.setColor(normalColor);
if(progress < 360)
{
canvas.drawArc(rectF, 270+progress, 360 - progress, progress_style== Paint.Style.FILL, mPaint);
}
mPaint.setColor(progressColor);
canvas.drawArc(rectF, 270, progress, progress_style== Paint.Style.FILL, mPaint);
fontMetrics = fontPaint.getFontMetrics();
float textWidth = fontPaint.measureText(centerText);
float textHeight = fontPaint.ascent() + fontPaint.descent();
canvas.drawText(centerText, width / 2 - textWidth / 2, height / 2 - textHeight / 2, fontPaint);
}
/**
* 更新界面
* @param progress
* @param text
*/
public void update(int progress,String text)
{
this.progress = progress;
this.centerText = text;
postInvalidate();
}
}
** declare-styleable **
<declare-styleable name="CircleProgressBar">
<!--文字大小-->
<attr name="text_size" format="dimension"/>
<!--文字颜色-->
<attr name="text_color" format="color"/>
<!--文本-->
<attr name="text" format="string"/>
<!--变宽宽度-->
<attr name="stroke_width" format="integer"/>
<!--未走的进度的颜色-->
<attr name="normal_color" format="color"/>
<!--已走的进度的颜色-->
<attr name="progress_color" format="color"/>
<!--已走的进度 0-360 -->
<attr name="progress" format="integer"/>
<!--类型 填充型,还是环形-->
<attr name="progress_style" format="enum">
<enum name="STROKE" value="0"/>
<enum name="FILL" value="1"/>
</attr>
</declare-styleable>
使用方式:
<com.xiaolei.xiaoui.CircleProgressBar
android:id="@+id/circleProgressBar"
android:layout_width="300dp"
android:layout_height="300dp"
app:stroke_width="20"
app:text_color="#ff0000"
app:text_size="30sp"
app:progress_style="STROKE"
app:normal_color="#A5A5A5"
app:progress_color="#FA9025"
app:progress="60"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
** MainActivity.java **
CircleProgressBar progressBar = (CircleProgressBar) findViewById(R.id.circleProgressBar);
........
while (true)
{
Thread.sleep(30);
progress ++;
progressBar.update(progress,progress*100/360+"%");
if(progress == 360)
{
progress = 0;
}
}
大功告成(' _ ')
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- 参考基因组没有,经费也没那么多,怎么办?
- .Net下SQLite的DBHelp
- 数据库进程间通信解决方案之MQ
- 【学术】算法交易的神经网络:强化经典策略
- java.util.logging 例子
- WPF命令(Command)介绍、命令和数据绑定集成应用
- lncRNA实战项目-第六步-WGCNA相关性分析
- 【项目】Github上的一个简单项目:用人工智能预测大学录取概率
- lncRNA实战项目-第五步-差异表达的mRNA和lncRNA
- WPF--模板选择
- 高级运维工程师面试题(更新中)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- prometheus-nginxlog-exporter构建Nginx日志监控
- s3cmd put文件的过程
- Ceph RGW配置Nginx代理出现S3Error: 403 (Forbidden)
- OmniDiskSweeper清理系统文件
- 【Kubernetes】通过ConfigMap修改容器的DNS
- 【Tensorflow 2.x】检验MKL
- kubernetes dashboard insecure配置
- seqtk抽取reads
- Version of Delve is too old for this version of Go【Goland Debug】报错
- python之turtle模块-黄金螺线
- python之turtle模块-生化危机
- Python之turtle模块-饼状图
- python之turtle模块-弧线
- Python之turtle模块-画圈圈
- Python之turtle模块-正多边形