分享一个环形进度条供大家参考,项目地址

效果如图

image

下面是该自定义进度条的代码,目前属于简陋版本,不过注释很详细,方便扩展。

首先是自定View的代码

/**

* 作者:GJP on 2018/7/26 15:12

* 邮箱:xiaoxiao9575@126.com

* 描述:

*/

public class CircularProgressView extends View {

private Context mContext;

private Paint mPaint;

private int mProgress = 0;

private static int MAX_PROGRESS = 100;

/** * 弧度 */

private int mAngle;

/** * 中间的文字 */

private String mText;

/** * 外圆颜色 */

private int outRoundColor;

/** * 内圆的颜色 */

private int inRoundColor;

/** * 线的宽度 */

private int roundWidth;

private int style;

/*** 字体颜色*/

private int textColor;

/** * 字体大小 */

private float textSize;

/** * 字体是否加粗 */

private boolean isBold;

/** * 进度条颜色 */

private int progressBarColor;

public CircularProgressView(Context context) {

this(context, null);

}

public CircularProgressView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public CircularProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr);

mContext = context;

init(attrs);

}

@TargetApi(21)

public CircularProgressView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

mContext = context;

init(attrs);

}

/**

* 解析自定义属性

* @param attrs

*/

public void init(AttributeSet attrs) {

mPaint = new Paint();

TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);

outRoundColor = typedArray.getColor(R.styleable.CircleProgressBar_outCircleColor, getResources().getColor(R.color.colorPrimary));

inRoundColor = typedArray.getColor(R.styleable.CircleProgressBar_inCircleColor, getResources().getColor(R.color.colorPrimaryDark));

progressBarColor = typedArray.getColor(R.styleable.CircleProgressBar_progressColor, getResources().getColor(R.color.colorAccent));

isBold = typedArray.getBoolean(R.styleable.CircleProgressBar_textBold, false);

textColor = typedArray.getColor(R.styleable.CircleProgressBar_textColor, Color.BLACK);

roundWidth = typedArray.getDimensionPixelOffset(R.styleable.CircleProgressBar_lineWidth, 20);

typedArray.recycle();

}

@Override

protected void onDraw(Canvas canvas) { /** * 画外圆 */

super.onDraw(canvas);

int center = getWidth() / 2;//圆心

int radius = (center - roundWidth / 2);// 半径

mPaint.setColor(outRoundColor); //外圆颜色

mPaint.setStrokeWidth(roundWidth); //线的宽度

mPaint.setStyle(Paint.Style.STROKE); //空心圆

mPaint.setAntiAlias(true); //消除锯齿

canvas.drawCircle(center, center, radius, mPaint); //内圆

mPaint.setColor(inRoundColor);

radius = radius - roundWidth;

canvas.drawCircle(center, center, radius, mPaint); //画进度是一个弧线

mPaint.setColor(progressBarColor);

RectF rectF = new RectF(center - radius, center - radius, center + radius, center + radius);//圆弧范围的外接矩形

canvas.drawArc(rectF, -90, mAngle, false, mPaint);

canvas.save(); //平移画布之前保存之前画的

// 画进度终点的小球,旋转画布的方式实现

mPaint.setStyle(Paint.Style.FILL);

// 将画布坐标原点移动至圆心

canvas.translate(center, center);

// 旋转和进度相同的角度,因为进度是从-90度开始的所以-90度

canvas.rotate(mAngle - 90);

// 同理从圆心出发直接将原点平移至要画小球的位置

canvas.translate(radius, 0);

canvas.drawCircle(0, 0, roundWidth, mPaint);

// 画完之后恢复画布坐标

canvas.restore();

// 画文字将坐标平移至圆心

canvas.translate(center, center);

mPaint.setStrokeWidth(0);

mPaint.setColor(textColor);

if (isBold) { //字体加粗

mPaint.setTypeface(Typeface.DEFAULT_BOLD);

} if (!TextUtils.isEmpty(mText)) {

// 动态设置文字长为圆半径,计算字体大小

float textLength = mText.length();

textSize = radius / textLength;

mPaint.setTextSize(textSize);

// 将文字画到中间

float textWidth = mPaint.measureText(mText);

canvas.drawText(mText, -textWidth / 2, textSize / 2, mPaint);

}

}

public int getProgress() {

return mProgress;

}

/**

* 设置进度

* @return

*/

public void setProgress(int p) {

if (p > MAX_PROGRESS) {

mProgress = MAX_PROGRESS;

mAngle = 360;

} else {

mProgress = p;

mAngle = 360 * p / MAX_PROGRESS;

}

//更新画布

invalidate();

}

public String getText() {

return mText;

}

/**

* 设置文本

* @param mText

*/

public void setText(String mText) {

this.mText = mText;

invalidate();

}

}

styles.xml中需要添加

再布局文件中引用的示例代码

android:id="@+id/progress_bar"

android:layout_centerInParent="true"

android:layout_centerHorizontal="true"

android:layout_width="150dp"

android:layout_height="150dp"

app:inCircleColor="#DCDCDC"

app:outCircleColor="#F0F0F0"

app:progressColor="#50CE7B"

app:textBold="true"

app:textColor="#50CE7B"

app:lineWidth="5dp" />

Activity中具体控制进度

public class MainActivity extends AppCompatActivity {

private CircularProgressView progress_bar;

@SuppressLint("HandlerLeak")

private Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

progress_bar.setProgress(msg.what);

progress_bar.setText(progress_bar.getProgress()+"%");

addProgress(msg.what);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView() {

progress_bar = (CircularProgressView) findViewById(R.id.progress_bar);

progress_bar.setProgress(0);

progress_bar.setText(progress_bar.getProgress()+"%");

addProgress(0);

}

private void addProgress(int i) {

if (i>=100){

i = 0;

}else {

++i;

}

handler.sendEmptyMessageDelayed(i, 100);

}

}

关于这个自定义的环形进度条没什么说的,代码注释很详细,使用方法都粘贴出来了,因为扩展起来很方便所以粘贴出来供大家参考和自己留作记录,如果有时间后续会发一个完善些的圆形进度条到GitHub上。

Android 隐藏环形进度条,Android环形进度条相关推荐

  1. android隐藏app应用程序,Android开发:怎样隐藏自己的app应用

    本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 第一种 改动Activity标签下的节点下的cate ...

  2. Android隐藏导航栏按键,Android如何控制导航栏单个按键的显隐状态

    我们都知道Android系统的导航栏通常有三个按键,分别是BACK, HOME, APP_SWITCH. 网上很多有关导航栏和状态栏显隐的文章,但几乎都是控制导航栏或状态栏所有按键同时显示或消失,如果 ...

  3. android隐藏软键盘方法,Android显示和隐藏软键盘方法

    InputMethodManager类 Android中软键盘的管理主要是通过InputMethodManager类来完成的. InputMethodManager对象的获取方法如下: 获取到Inpu ...

  4. android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘

    Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...

  5. Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条

    可实现多种渐变.直角or弧角.进度条.加载条 (Various gradient, right or arc angle, progress bar and loading bar can be re ...

  6. Android 自定义View实现环形带刻度的进度条

    本篇文章讲的是自定义View实现环形带刻度的进度条.和往常一样,主要还是想总结一下自定义View实现环形带刻度的进度条的开发过程以及一些需要注意的地方. 按照惯例,我们先来看看效果图 一.我们如何来实 ...

  7. Android的进度条(ProgressBar)、拖动条(SeekBar)

    Android的进度条与拖动条 一.ProgressBar(进度条) 进度条,ProgressBar,分为环形和水平条行, 首先看下效果图,Progress进度加载. 进度条XML中的属性       ...

  8. android编程任务进度条,Android 进度条 ProgressBar - Android 入门教程

    今天要学的是一个特定场合要用到的控件--进度条控件.进度条的作用不言而喻,而在实际使用中,通常会有两种类型的进度条:横向进度条和圆形进度条.当然,ProgressBar 也是支持这两种类型的,可以应对 ...

  9. android 4.2.2进度条,Android实现个性化的进度条

    1.案例效果图 2.准备素材 progress1.png(78*78) progress2.png(78*78) 3.原理 采用一张图片作为ProgressBar的背景图片(一般采用颜色比较浅的).另 ...

  10. android加载百分比功能,android进度条怎么显示百分比

    android布局文件里的ProgressBar长形进度条怎么自 在windows操作系统下Android studio按照如下步骤自动义ProgressBar长形进度条的样式. 首先创建一个andr ...

最新文章

  1. 【青少年编程】【一级】 奔跑的马
  2. 百度云盘上传文件和下载文件慢的解决办法
  3. 降采样处理 resample函数
  4. 多个输出用java怎么写_请问用java写程序怎么输出这两个图形
  5. 1.1 lambda表达式
  6. SpringBoot中Bean按条件装配
  7. mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
  8. android 框架_推荐一个更贴近 android 场景的启动框架 | Anchors
  9. Undefined symbols for architecture x86_64:
  10. echarts环形图加边框
  11. 微信小程序登陆方式,详细代码步骤如下。
  12. 移动硬盘安装双系统windows10和ubuntu18.04
  13. 【Unity】Sprite Atlas功能讲解
  14. 《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销
  15. 入网许可证_入网许可证真伪鉴别
  16. 自动化测试工程师应聘要求
  17. 如何下载 International Conference on Machine Learning(ICML)顶会的论文?从哪找ICML顶会论文?如何判断会议和期刊级别?
  18. Redis 使用场景
  19. Win10 OneNote 一直卡的登录界面
  20. [生存志] 第31节 盘古开天地

热门文章

  1. 离职因多写3个字被索赔2.9万,这家公司的操作让网友直呼拳头摁了......
  2. 百度统计挂了,分布式数据库异常引起,数据显示为空!
  3. 各种流行的编程风格 你属于哪一种?
  4. Valine+Leancloud搭建评论模块
  5. Linux进阶之给nginx设置登录用户验证
  6. C# 异步查询数据库(第二版)
  7. 《信息安全系统设计基础》第三周学习总结
  8. mysql事件关闭解决办法
  9. HashTable HashMap区分
  10. 菜鸟 学注册机编写之 “序列号组合”