软件编程
位置:首页>> 软件编程>> Android编程>> Android自定义漂亮的圆形进度条

Android自定义漂亮的圆形进度条

作者:一叶飘舟  发布时间:2023-08-04 04:23:06 

标签:Android,进度条

这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示

Android自定义漂亮的圆形进度条

TasksCompletedView.java 代码如下


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.View;

import com.snailws.taskscompleted.R;

/**
* @author naiyu(http://snailws.com)
* @version 1.0
*/
public class TasksCompletedView 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;

public TasksCompletedView(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.TasksCompletedView, 0, 0);
       mRadius = typeArray.getDimension(R.styleable.TasksCompletedView_radius, 80);
       mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_strokeWidth, 10);
       mCircleColor = typeArray.getColor(R.styleable.TasksCompletedView_circleColor, 0xFFFFFFFF);
       mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor, 0xFFFFFFFF);

mRingRadius = mRadius + mStrokeWidth / 2;
   }

private void initVariable() {
       mCirclePaint = new Paint();
       mCirclePaint.setAntiAlias(true);
       mCirclePaint.setColor(mCircleColor);
       mCirclePaint.setStyle(Paint.Style.FILL);

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.setARGB(255, 255, 255, 255);
       mTextPaint.setTextSize(mRadius / 2);

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);

if (mProgress > 0 ) {
           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 + "%";
           mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
           canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);
       }
   }

public void setProgress(int progress) {
       mProgress = progress;
//        invalidate();
       postInvalidate();
   }

}

attrs.xml


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

<declare-styleable name="TasksCompletedView">
   <attr name="radius" format="dimension"/>
   <attr name="strokeWidth" format="dimension"/>
   <attr name="circleColor" format="color"/>
   <attr name="ringColor" format="color"/>
 </declare-styleable>

</resources>

源码下载:http://xiazai.jb51.net/201701/yuanma/AndroidCompleted(jb51.net).rar

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com