Android中怎么实现圆形渐变加载进度条
创始人
2024-12-22 18:20:21
0次

package com.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.SweepGradient;import android.util.AttributeSet;import android.view.View;import com.fx.R;public class CompletedView extends View {  // 画实心圆的画笔  private Paint mCirclePaint;  // 画圆环的画笔  private Paint mRingPaint;  // 画圆环的画笔背景色  private Paint mRingPaintBg;  // 画字体的画笔  private Paint mTextPaint;  // 圆形颜色  private int mCircleColor;  // 圆环颜色  private int mRingColor;  // 圆环背景颜色  private int mRingBgColor;  // 半径  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;  private String string;  public CompletedView(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);    mRingBgColor = typeArray.getColor(R.styleable.TasksCompletedView_ringBgColor, 0xFFFFFFFF);    mRingRadius = mRadius + mStrokeWidth / 2;  }  RectF oval;  //初始化画笔  private void initVariable() {    oval = new RectF();    //内圆    mCirclePaint = new Paint();    mCirclePaint.setAntiAlias(true);    mCirclePaint.setColor(mCircleColor);    mCirclePaint.setStyle(Paint.Style.FILL);    mCirclePaint.setStrokeCap(Paint.Cap.ROUND);    //外圆弧背景    mRingPaintBg = new Paint();    mRingPaintBg.setAntiAlias(true);    mRingPaintBg.setColor(mRingBgColor);    mRingPaintBg.setStyle(Paint.Style.STROKE);    mRingPaintBg.setStrokeWidth(mStrokeWidth);    //外圆弧    mRingPaint = new Paint();    mRingPaint.setAntiAlias(true);//    mRingPaint.setColor(mRingColor);    mRingPaint.setStyle(Paint.Style.STROKE);    mRingPaint.setStrokeWidth(mStrokeWidth);    mRingPaint.setStrokeCap(Paint.Cap.ROUND);//设置线冒样式,有圆 有方    //中间字    mTextPaint = new Paint();    mTextPaint.setAntiAlias(true);    mTextPaint.setStyle(Paint.Style.FILL);    mTextPaint.setColor(mRingColor);    mTextPaint.setTextSize(mRadius / 2);    Paint.FontMetrics fm = mTextPaint.getFontMetrics();    mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);  }  SweepGradient sweepGradient;  //画图  @Override  protected void onDraw(Canvas canvas) {    mXCenter = getWidth() / 2;    mYCenter = getHeight() / 2;    //内圆    canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);    //外圆弧背景    RectF oval1 = new RectF();    oval1.left = (mXCenter - mRingRadius);    oval1.top = (mYCenter - mRingRadius);    oval1.right = mRingRadius * 2 + (mXCenter - mRingRadius);    oval1.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);    canvas.drawArc(oval1, 0, 360, false, mRingPaintBg); //圆弧所在的椭圆对象、圆弧的起始角度、圆弧的角度、是否显示半径连线    //外圆弧    if (mProgress > 0 ) {      oval.left = (mXCenter - mRingRadius);      oval.top = (mYCenter - mRingRadius);      oval.right = mRingRadius * 2 + (mXCenter - mRingRadius);      oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);      if (sweepGradient==null) {        int[] arcColors= new int[]{mRingColor,Color.parseColor("#b05e39"),mRingColor};        float[] arcPostion=new float[]{0.0f,0.5f,0.95f};//        sweepGradient = new SweepGradient(mXCenter, mYCenter, mRingColor,Color.parseColor("#b05e39"));        sweepGradient = new SweepGradient(mXCenter, mYCenter, arcColors,arcPostion);        Matrix matrix = new Matrix();        matrix.setRotate(-90,mXCenter,mYCenter);        sweepGradient.setLocalMatrix(matrix);        mRingPaint.setShader(sweepGradient);      }      canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) * 360, false, mRingPaint); //      //字体      String txt = mProgress + "%";      mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());      canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);    }  }  public void setText(String string){  }  //设置进度  public void setProgress(int progress) {    mProgress = progress;    postInvalidate();//重绘  }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...