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

 更新时间:2016年11月26日 08:58:44   投稿:lqh  
进度条在Android中教程使用到,本文章向大家介绍一下Android自定义圆形进度条实现代码,需要的朋友可以参考一下。

Android 自定义圆形进度条

今天无意中发现一个圆形进度,想想自己实现一个,如下图:

基本思路是这样的:

1.首先绘制一个实心圆

2.绘制一个白色实心的正方形,遮住实心圆

3.在圆的中心动态绘制当前进度的百分比字符

4.绘制一个与之前实心圆相同颜色的空心圆

5.逐渐改变当前的百分比

6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100%

首先看看自定义的属性

在values目录下新建attrs.xml内容如下:

定义绘制圆形的背景色,和绘制圆形的半径大小

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <attr name="circlecolor" format="color"></attr>
  <attr name="half" format="dimension"></attr>

  <declare-styleable name="myCircleImage">
    <attr name="circlecolor"></attr>
    <attr name="half"></attr>
  </declare-styleable>

</resources>

自定义视图

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class CirclePro extends View {

 private Paint paint;
 private int circleBack;//圆的背景色
 private int mschedual = 0;//用于控制动态变化
 float circleHalf; //圆的半径
 String percent = "";//绘制百分比的字符串

 @SuppressLint("Recycle")
 public CirclePro(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 paint = new Paint();
 TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.myCircleImage, defStyleAttr,0);
 @SuppressWarnings("unused")
 int leng = array.length();
 //获取自定义的属性,这里注意是R.styleable.myCircleImage_circlecolor而不是R.attr.circlecolor
 circleBack = array.getColor(R.styleable.myCircleImage_circlecolor,Color.GREEN);
 circleHalf = array.getDimension(R.styleable.myCircleImage_half,200.f);
 System.out.println(circleBack);

 }

 /**
 * 这个构造参数,当在布局文件中引用该view的时候,必须重写该构造函数
 * @param context
 * @param attrs
 */
 public CirclePro(Context context, AttributeSet attrs) {
 this(context, attrs, 0);//调用自己的构造函数

 }

 /**
 * 根据文本的
 * @param text
 * @param textSize
 * @return
 */
 public float getTextWidth(String text,float textSize) {

 TextPaint textPaint = new TextPaint();
 textPaint.setTextSize(textSize);
 return textPaint.measureText(text);
 }

 @Override
 protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 super.onDraw(canvas);

 float height = getHeight();
 float width = getWidth();
// float circleHalf = (float) (width*0.7/2);

 paint.setColor(circleBack);
 paint.setAntiAlias(true);
 paint.setStyle(Paint.Style.FILL);
 canvas.drawCircle(width/2,height/2,circleHalf, paint);//画实心圆

 if (mschedual <= 100) {//,如果当前进度小于100,画实心矩形
  paint.setColor(Color.WHITE);
  canvas.drawRect(width/2-circleHalf,height/2-circleHalf,width/2+circleHalf,height/2+circleHalf - mschedual*circleHalf/50, paint);
 }

 //画当前进度的字符串
 paint.setColor(Color.BLACK);
 paint.setTextSize(30.f);
 percent = mschedual+" %";
 canvas.drawText(percent, width/2-getTextWidth(percent,30)/2,height/2+paint.getTextSize()*3/8, paint);//字体的高度=paint.getTextSize()*3/4

 //画空心圆
 paint.setColor(circleBack);
 paint.setStyle(Paint.Style.STROKE);
 canvas.drawCircle(width/2,height/2,circleHalf, paint);

 if (mschedual < 100) {//更改当前进度值,并重绘
  mschedual++;
  invalidate();
 }
 }
}

在activity_main.xml中,需要用到自定义的属性,首先添加命名空间:

xmlns:liu=”http://schemas.android.com/apk/res/com.example.androidcirclepro”

其中liu是自定义的一个前缀,随意命名的,com.example.androidcirclepro是我们的应用的包名

activity_main.xmln内容如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:liu="http://schemas.android.com/apk/res/com.example.androidcirclepro"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity" >

  <com.example.androidcirclepro.CirclePro
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    liu:half="90dp"
    liu:circlecolor="#fff0f0"
    />

</RelativeLayout>

至此一个自定义的圆形进度条就完成了,是不是很简单。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Android通过单点触摸移动图片

    Android通过单点触摸移动图片

    这篇文章主要为大家详细介绍了Android通过单点触摸移动图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • android 6.0下webview的定位权限设置方法

    android 6.0下webview的定位权限设置方法

    今天小编就为大家分享一篇android 6.0下webview的定位权限设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android实现网页图片浏览功能

    Android实现网页图片浏览功能

    这篇文章主要为大家详细介绍了Android实现网页图片浏览功能,输入图片的url然后点击按钮加载出来图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • android中对文件加密解密的实现

    android中对文件加密解密的实现

    本文主要介绍了android中对文件加密解密的实现,文件加密现在的应用很广,有需要的朋友可以了解一下。
    2016-10-10
  • Android 图片添加水印的实现方法

    Android 图片添加水印的实现方法

    这篇文章主要介绍了Android 图片添加水印的实现方法的相关资料,添加水印的原理就是在画布Canvas上绘制图形、图片、文字等等, 得到你想要的效果图片,需要的朋友可以参考下
    2017-07-07
  • Android 照片选择区域功能实现示例

    Android 照片选择区域功能实现示例

    这篇文章主要介绍了Android 照片选择区域功能实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 月下载量上千次Android实现二维码生成器app源码分享

    月下载量上千次Android实现二维码生成器app源码分享

    既然是二维码生成器那么我们如何制作二维码呢?这篇文章为大家分享了月下载量上千次Android实现二维码生成器app源码,希望大家喜欢
    2015-12-12
  • 自定义Dialog弹框和其背景阴影显示方法

    自定义Dialog弹框和其背景阴影显示方法

    今天小编就为大家分享一篇自定义Dialog弹框和其背景阴影显示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android实现快递单号查询快递状态信息

    Android实现快递单号查询快递状态信息

    这篇文章主要为大家详细介绍了Android实现快递单号查询快递状态信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android编程中activity的完整生命周期实例详解

    Android编程中activity的完整生命周期实例详解

    这篇文章主要介绍了Android编程中activity的完整生命周期,结合实例形式较为详细的分析了Android编程中activity的原理与具体用法,需要的朋友可以参考下
    2015-12-12

最新评论