Android实现环形进度条的效果图如下:

自定义控件:AttendanceProgressBar

代码如下:

public class AttendanceProgressBar extends View {  // 画圆环底部的画笔  private Paint mCirclePaint;  // 画圆环的画笔  private Paint mRingPaint;  // 画字体的画笔  private Paint mTextPaint;  // 圆形颜色  private int mCircleColor;  // 圆环颜色  private int mRingColor;  // 半径  private float mRadius;  // 圆环半径  private float mRingRadius;  // 圆环宽度  private float mStrokeWidth;  // 圆心x坐标  private int mXCenter;  // 圆心y坐标  private int mYCenter;  // 字的长度  private float mTxtWidth;  // 字的高度  private float mTxtHeight;  // 总进度  private int mTotalProgress = 100;  // 当前进度  private int mProgress = 80;  //字体颜色  private int mTextColor;  // 字体大小  private float mTextSize;  public AttendanceProgressBar(Context context, AttributeSet attrs) {    super(context, attrs);    // 获取自定义的属性    initAttrs(context, attrs);    initVariable();  }  private void initAttrs(Context context, AttributeSet attrs) {    TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,        R.styleable.AttendanceProgressBar, 0, 0);    mRadius = typeArray.getDimension(R.styleable.AttendanceProgressBar_radius, 80);    mStrokeWidth = typeArray.getDimension(R.styleable.AttendanceProgressBar_strokeWidth, 10);    mCircleColor = typeArray.getColor(R.styleable.AttendanceProgressBar_circleColor, 0xFFFFFFFF);    mRingColor = typeArray.getColor(R.styleable.AttendanceProgressBar_ringColor, 0xFFFFFFFF);    mTextColor = typeArray.getColor(R.styleable.AttendanceProgressBar_textColor, 0xFF000000);    mTextSize = typeArray.getDimension(R.styleable.AttendanceProgressBar_textSize, 80);    mRingRadius = mRadius + mStrokeWidth / 2;  }  private void initVariable() {    mCirclePaint = new Paint();    mCirclePaint.setAntiAlias(true);    mCirclePaint.setColor(mCircleColor);//    mCirclePaint.setStyle(Paint.Style.FILL);    mCirclePaint.setStyle(Paint.Style.STROKE);    mCirclePaint.setStrokeWidth(mStrokeWidth);    mRingPaint = new Paint();    mRingPaint.setAntiAlias(true);    mRingPaint.setColor(mRingColor);    mRingPaint.setStyle(Paint.Style.STROKE);    mRingPaint.setStrokeWidth(mStrokeWidth);    mTextPaint = new Paint();    mTextPaint.setAntiAlias(true);    mTextPaint.setStyle(Paint.Style.FILL);    mTextPaint.setColor(mTextColor);//    mTextPaint.setARGB(255, 255, 255, 255);//    mTextPaint.setTextSize(mRadius / 2);    mTextPaint.setTextSize(mTextSize);    Paint.FontMetrics fm = mTextPaint.getFontMetrics();    mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);  }  @Override  protected void onDraw(Canvas canvas) {    mXCenter = getWidth() / 2;    mYCenter = getHeight() / 2;//    canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);    canvas.drawCircle(mXCenter, mYCenter, mRingRadius, mCirclePaint);    RectF oval = new RectF();    oval.left = (mXCenter - mRingRadius);    oval.top = (mYCenter - mRingRadius);    oval.right = mRingRadius * 2 + (mXCenter - mRingRadius);    oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);    canvas.drawArc(oval, -90, ((float) mProgress / mTotalProgress) * 360, false, mRingPaint); ////            canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);//      String txt = mProgress + "%";    String txt = "16/18";    mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());//      canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);    canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4 - dipToPx(10), mTextPaint);    txt = "出勤人数";    mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());    canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4 + dipToPx(10), mTextPaint);  }  public void setProgress(int progress) {    mProgress = progress;    postInvalidate();  }  private int dipToPx(int dip) {    float scale = getContext().getResources().getDisplayMetrics().density;    return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));  }}

因为是自定义控件,所以在attr.xml文件定义了一些控件属性,以便在xml文件中设置这些属性

代码如下:

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

最后,在xml文件中,可以这样使用

这只是初步处理,使用时可以根据需求酌情处理~如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多相关文章

  1. androidUI控件下载地址
  2. Android(安卓)在Fragment 中控制 Activity 的控件隐藏和显示
  3. Android常用的输入框
  4. Android(安卓)中ShapeDrawable的使用
  5. android绘图常用方法归纳
  6. android 的事件分发从源码分析
  7. 6.1.5 GridView详解编辑
  8. Android(安卓)创建复合控件
  9. Android(安卓)Studio编译失败:More than one file was found with

随机推荐

  1. android 自定义键盘 KeyboardView的key
  2. 专访罗升阳:老罗的Android之旅
  3. Java乔晓松-android使用ImageSwitcher布
  4. Android学习心得(5) --- dex数据类型LEB128
  5. 【Android】不弹root请求框检测手机是否r
  6. 学习笔记-Android自动提示框实现
  7. Android之实现定位
  8. Android(安卓)Listview之下拉刷新Wifi列
  9. android:使用audiotrack 类播放wav文件
  10. Android(安卓)Studio多渠道批量打包及代