Android自定义圆形进度条

今天小编来手写一个自定义圆形进度条:先看效果:

首先我们在attrs属性文件中增加几个自定义属性

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomProgressBar"> <!-- 圆形进度条进度显示的颜色 --> <attr name="roundProgressColor" format="color"></attr> <!-- 外圈圆的颜色 --> <attr name="roundColor" format="color"></attr> <!-- 圆的总宽度 --> <attr name="roundWidth" format="dimension"></attr> <!-- 字体显示的大小 --> <attr name="textSize" format="dimension"></attr> <!-- 字体显示的颜色 --> <attr name="textColor" format="color"></attr> <!-- 进度的最大值 --> <attr name="max" format="integer"></attr> <!-- 是否显示文字 --> <attr name="textShow" format="boolean"></attr> </declare-styleable> </resources>

上我们自定义类的实现代码:

package xxx.xxx.xxx; 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.graphics.Typeface; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import test.dn.com.dn_test.R; /** * Created by Administrator on 2017/5/16 0016. */ public class CircleProgressBar extends View { private int max; //最大值 private int roundColor; //圆形进度条的颜色 private int roundProgressColor;//圆形进度条进度的颜色 private int textColor; //字体的颜色 private float textSize; //字体的大小 private float roundWidth; //圆的宽度 private boolean textShow; //是否显示圆 private int progress; //当前进度 private Paint mPaint; //画笔 public static final int STROKE = 0; public static final int FILL = 1; public CircleProgressBar(Context context, @Nullable AttributeSet attrs) { super(context, attrs); //初始化一只笔 mPaint = new Paint(); //获取xml当中设置的属性,如果没有设置,则设置一个默认值 TypedArray typedArray = context.obtainStyledAttributes(attrs , R.styleable.CustomProgressBar); max = typedArray.getInteger(R.styleable.CustomProgressBar_max , 100); roundColor = typedArray.getColor(R.styleable.CustomProgressBar_roundColor, Color.RED); roundProgressColor = typedArray.getColor(R.styleable.CustomProgressBar_roundProgressColor , Color.BLUE); textColor = typedArray.getColor(R.styleable.CustomProgressBar_textColor , Color.GREEN); textSize = typedArray.getDimension(R.styleable.CustomProgressBar_textSize , 55); roundWidth = typedArray.getDimension(R.styleable.CustomProgressBar_roundWidth , 10); textShow = typedArray.getBoolean(R.styleable.CustomProgressBar_textShow , true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画背景圆环 int center = getWidth() / 2; //设置半径 float radius = center - roundWidth / 2; //设置圆圈的颜色 mPaint.setColor(roundColor); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(roundWidth);//圆环的宽度 mPaint.setAntiAlias(true);//设置抗锯齿 //画外圈 canvas.drawCircle(center , center ,radius , mPaint); //画进度百分比 mPaint.setColor(textColor); mPaint.setStrokeWidth(0); //设置字体大小 mPaint.setTextSize(textSize); mPaint.setTypeface(Typeface.DEFAULT); //设置笔帽 mPaint.setStrokeCap(Paint.Cap.ROUND); //设置文字的摆放方式为居中 mPaint.setTextAlign(Paint.Align.CENTER); //获取当前进度的值 int percent = (int) (progress / (float)max * 100); String strPercent = percent + "%"; //获取画笔的文字属性,总共有bottom , top , leading , ascent , descent 这个以后会详细讲解 Paint.FontMetricsInt fm = mPaint.getFontMetricsInt(); if(percent != 0){ canvas.drawText(strPercent , getWidth() / 2 , getWidth() / 2 + (fm.bottom - fm.top) / 2 - fm.bottom, mPaint); } //画圆弧 RectF oval = new RectF(center - radius , center - radius ,center + radius , center + radius); mPaint.setColor(roundProgressColor); mPaint.setStrokeWidth(roundWidth); mPaint.setStyle(Paint.Style.STROKE); //设置笔帽 mPaint.setStrokeCap(Paint.Cap.ROUND); //话进度 canvas.drawArc(oval , 0 , 360 * progress / max , false , mPaint); } public void setProgress(int progress){ if(progress < 0){ throw new IllegalArgumentException("进度progress不能小于0"); } if(progress > max){ progress = max; } if(progress <= max){ this.progress = progress; postInvalidate(); } } }

在我们的xml中设置控件:

<xxx.xxx.CircleProgressBar android:id="@+id/progressbar" android:layout_width="100dp" android:layout_height="100dp" app:roundProgressColor="#ff00ff" app:textColor="#666666" app:textSize="20dp" app:roundWidth="15dp" />

Activity功能实现代码:

mProgressBar = (CircleProgressBar) findViewById(R.id.progressbar); mProgressBar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //模拟http请求 new Thread(new Runnable() { @Override public void run() { while (progress <= 100){ progress += 2; mProgressBar.setProgress(progress); //模拟网络请求,每隔100毫秒增加一个进度 SystemClock.sleep(100); } } }).start(); } });

完结!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-12-24 08:23:23

Android自定义圆形进度条的相关文章

Android 实现自定义圆形进度条的功能_Android

Android 实现自定义圆形进度条:                 Android 自定义view,在大多数项目中根据客户需求及用户的体验度来说,都要重新写控件的来展示漂亮的界面,这里就对圆形进度条说下如何实现. 绘制自定义的圆形进度条,分为三个步骤,内圆.外圆.文字. 其中内圆和文字比较好绘制,进度条的变化是由外圆来控制的,所以核心就是绘制外圆. 首先定义分别定义这三个画笔,两个Paint和一个TextPaint mCirclePaint = new Paint(); mCirclePai

Android 实现自定义圆形进度条的实例代码_Android

Android 自定义圆形进度条 今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制当前进度的百分比字符 4.绘制一个与之前实心圆相同颜色的空心圆 5.逐渐改变当前的百分比 6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100% 首先看看自定义的属性 在values目录下新建attrs.xml内容如下: 定义绘制圆形的背景色,和绘制圆形的半径

Android 实现自定义圆形进度条的实例代码

Android 自定义圆形进度条 今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制当前进度的百分比字符 4.绘制一个与之前实心圆相同颜色的空心圆 5.逐渐改变当前的百分比 6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100% 首先看看自定义的属性 在values目录下新建attrs.xml内容如下: 定义绘制圆形的背景色,和绘制圆形的半径

Android三种方式实现ProgressBar自定义圆形进度条_Android

进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条. Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.通过动画实现 定义res/a

Android实现自定义圆形进度条_Android

今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制当前进度的百分比字符 4.绘制一个与之前实心圆相同颜色的空心圆 5.逐渐改变当前的百分比 6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100% 首先看看自定义的属性 在values目录下新建attrs.xml内容如下: 定义绘制圆形的背景色,和绘制圆形的半径大小 <?xml version=

Android三种方式实现ProgressBar自定义圆形进度条

进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条. Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.通过动画实现 定义res/a

Android动态自定义圆形进度条

效果图: A.绘制圆环,圆弧,文本 //1.画圆环 //原点坐标 float circleX = width / 2; float circleY = width / 2; //半径 float radius = width / 2 - roundWidth / 2; //设置画笔的属性 paint.setColor(roundColor); paint.setStrokeWidth(roundWidth); paint.setStyle(Paint.Style.STROKE); canvas.

自定义圆形进度条ProgressBar的三种方式

http://liuzhichao.com/p/636.html 进度条默认是不确定(indeterminate=true)Android进度条 Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.

Android studio圆形进度条 百分数跟随变化

本文实例为大家分享了Android studio圆形进度条展示的具体代码,供大家参考,具体内容如下 MainActivity import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity impl