/** * 一个圆形百分比进度的自定义View */ public class CustomCirclePercentView extends View { /** 圆的半径*/ private float mRadius; /** 色带的宽度*/ private float mStripeWidth; /** 总体宽高大小*/ private int mHeight; private int mWidth; /** 动画位置百分比进度*/ private int mCurPercent; /** 实际百分比进度*/ private int mPercent; /** 圆心坐标*/ private float x; private float y; /** 要画的弧度*/ private int mEndAngle; /** 小圆的颜色 圆环*/ private int mSmallColor; /** 大圆颜色*/ private int mBigColor; /** 中心百分比文字大小*/ private float mCenterTextSize; /** 传入的百分比参数是否大于零的标记、用来控制是否开始画自定义view*/ private boolean flag; /** 定义一个圆环动画结束的标记*/ private boolean endFlag; private int BWScreenWidth; private int BWScreenHeight; public CustomCirclePercentView(Context context) { this(context, null); } public CustomCirclePercentView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomCirclePercentView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomCirclePercentView, defStyleAttr, 0); mStripeWidth = a.getDimension(R.styleable.CustomCirclePercentView_stripeWidth, CommonUtils.dpToPx(30, context)); mCurPercent = a.getInteger(R.styleable.CustomCirclePercentView_percent, 0); mSmallColor = a.getColor(R.styleable.CustomCirclePercentView_smallColor,0xffafb4db); mBigColor = a.getColor(R.styleable.CustomCirclePercentView_bigColor,0xff6950a1); mCenterTextSize = a.getDimensionPixelSize(R.styleable.CustomCirclePercentView_centerTextSize,CommonUtils.spToPx(20,context)); mRadius = a.getDimensionPixelSize(R.styleable.CustomCirclePercentView_radius,CommonUtils.dpToPx(100,context)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //获取测量模式 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); //获取测量大小 int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) { mRadius = widthSize / 2; x = widthSize / 2; y = heightSize / 2; mWidth = widthSize; mHeight = heightSize; } if(widthMode == MeasureSpec.AT_MOST&&heightMode ==MeasureSpec.AT_MOST){ mWidth = (int) (mRadius*2); mHeight = (int) (mRadius*2); x = mRadius; y = mRadius; } // setMeasuredDimension(BWScreenWidth, BWScreenHeight); setMeasuredDimension(mWidth,mHeight); } // public void setWidthHeight(int width, int height) { // this.BWScreenHeight = height; // this.BWScreenWidth = width; // } @Override protected void onDraw(Canvas canvas) { if(!flag){ mEndAngle = 0; }else{ mEndAngle = (int) (mCurPercent * 3.6); } //绘制大圆 Paint bigCirclePaint = new Paint(); bigCirclePaint.setAntiAlias(true); bigCirclePaint.setColor(mBigColor); canvas.drawCircle(x, y, mRadius, bigCirclePaint); //饼状图 Paint sectorPaint = new Paint(); sectorPaint.setColor(mSmallColor); sectorPaint.setAntiAlias(true); RectF rect = new RectF(0, 0, mWidth, mHeight); canvas.drawArc(rect,270, mEndAngle, true, sectorPaint); //绘制小圆,颜色透明 Paint smallCirclePaint = new Paint(); smallCirclePaint.setAntiAlias(true); // smallCirclePaint.setColor(mBigColor);Color.parseColor("#F5F5F5") smallCirclePaint.setColor(Color.parseColor("#FFFFFF")); //小圆设置为和activity一样的色值 canvas.drawCircle(x, y, mRadius - mStripeWidth, smallCirclePaint); //绘制文本 // Paint textPaint = new Paint(); // String text = mCurPercent + "%"; // // textPaint.setTextSize(mCenterTextSize); // float textLength = textPaint.measureText(text); // // textPaint.setColor(Color.WHITE); // canvas.drawText(text, x - textLength/2, y, textPaint); if(flag){ //TODO 用于圆环开始时画的圆圈 float pointX = x; float pointY = y - mRadius + (mStripeWidth/2); Paint pointCirclePaint = new Paint(); pointCirclePaint.setAntiAlias(true); pointCirclePaint.setColor(mSmallColor); canvas.drawCircle(pointX, pointY, mStripeWidth/2, pointCirclePaint); } if(endFlag && flag){ //TODO 用于圆环结束时画的圆圈 float pointX = (float) (x + (mRadius - mStripeWidth/2) * Math.cos((mEndAngle - 90)*3.14/180)); float pointY = (float) (y + (mRadius - mStripeWidth/2) * Math.sin((mEndAngle - 90)*3.14/180)); Paint pointCirclePaint = new Paint(); pointCirclePaint.setAntiAlias(true); pointCirclePaint.setColor(mSmallColor); canvas.drawCircle(pointX, pointY, mStripeWidth/2, pointCirclePaint); } } public void setPercent(int percent) { //TODO 外部设置百分比数 if (percent > 100) { throw new IllegalArgumentException("percent must less than 100!"); } setCurPercent(percent); } //内部设置百分比 用于动画效果 private void setCurPercent(int percent) { mPercent = percent + 1; new Thread(new Runnable() { @Override public void run() { int sleepTime = 1; for(int i = 0;i < mPercent;i++){ if(i%5 == 0){ sleepTime+=1; } try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } mCurPercent = i; if(mPercent > 1){ flag = true; }else{ flag = false; } if(i == mPercent - 1){ endFlag = true; }else{ endFlag = false; } CustomCirclePercentView.this.postInvalidate(); } } }).start(); }}
attrs文件:
<declare-styleable name="CustomCirclePercentView"><!--自定义圆环进度展示attr--> <attr name="radius" format="dimension"/> <attr name="stripeWidth" format="dimension"/><!--色带宽度--> <attr name="percent" format="integer"/><!--百分比 最大值为100--> <attr name="smallColor" format="color"/><!--色带宽度颜色--> <!--外圈颜色--> <attr name="bigColor" format="color"/> <!--中间字体颜色--> <attr name="centerTextSize" format="dimension"/> <!--色带宽度--> </declare-styleable>
布局文件: 布局最外层需布局指定命名空间 xmlns:app="http://schemas.android.com/apk/res-auto"
<com.joyame.sixduoa.app.widget.CustomCirclePercentView android:id="@+id/mCustomCirclePercentView" android:layout_width="200dp" android:layout_height="200dp" app:bigColor="#EFEFEF" app:centerTextSize="16sp" app:percent="45" app:radius="100dp" app:smallColor="#32DCB4" app:stripeWidth="10dp" />
用到的Activity调用方法:
private void setCircleProgress(int totalNumber, int punchCardNumber) { //TODO 设置圆环进度百分比 if (totalNumber > 0 && punchCardNumber > 0) { mCustomCirclePercentView.setPercent((punchCardNumber / totalNumber) * 100); } }
安卓自定义圆环进度
最新推荐文章于 2023-02-10 22:57:13 发布