首页 > 系统 > Android > 正文

Android自定义view渐变圆形动画

2019-12-12 00:16:20
字体:
来源:转载
供稿:网友

本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下

直接上效果图

自定义属性

attrs.xml文件

<resources>  <declare-styleable name="ProgressRing">    <!--进度起始色-->    <attr name="pr_progress_start_color" format="color" />    <!--进度结束色-->    <attr name="pr_progress_end_color" format="color" />    <!--背景起始色-->    <attr name="pr_bg_start_color" format="color" />    <!--背景中间色-->    <attr name="pr_bg_mid_color" format="color" />    <!--背景结束色-->    <attr name="pr_bg_end_color" format="color" />    <!--进度值 介于0-100-->    <attr name="pr_progress" format="integer" />    <!--进度宽度-->    <attr name="pr_progress_width" format="dimension" />    <!--起始角度-->    <attr name="pr_start_angle" format="integer" />    <!--扫过的角度-->    <attr name="pr_sweep_angle" format="integer" />    <!--是否显示动画-->    <attr name="pr_show_anim" format="boolean" />  </declare-styleable></resources>

创建一个类 ProgressRing继承自 view

public class ProgressRing extends View {  private int progressStartColor;  private int progressEndColor;  private int bgStartColor;  private int bgMidColor;  private int bgEndColor;  private int progress;  private float progressWidth;  private int startAngle;  private int sweepAngle;  private boolean showAnim;  private int mMeasureHeight;  private int mMeasureWidth;  private Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);  private Paint progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);  private RectF pRectF;  private float unitAngle;  private int curProgress = 0;  public ProgressRing(Context context, AttributeSet attrs) {    super(context, attrs);    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ProgressRing);    progressStartColor = ta.getColor(R.styleable.ProgressRing_pr_progress_start_color, Color.YELLOW);    progressEndColor = ta.getColor(R.styleable.ProgressRing_pr_progress_end_color, progressStartColor);    bgStartColor = ta.getColor(R.styleable.ProgressRing_pr_bg_start_color, Color.LTGRAY);    bgMidColor = ta.getColor(R.styleable.ProgressRing_pr_bg_mid_color, bgStartColor);    bgEndColor = ta.getColor(R.styleable.ProgressRing_pr_bg_end_color, bgStartColor);    progress = ta.getInt(R.styleable.ProgressRing_pr_progress, 0);    progressWidth = ta.getDimension(R.styleable.ProgressRing_pr_progress_width, 8f);    startAngle = ta.getInt(R.styleable.ProgressRing_pr_start_angle, 150);    sweepAngle = ta.getInt(R.styleable.ProgressRing_pr_sweep_angle, 240);    showAnim = ta.getBoolean(R.styleable.ProgressRing_pr_show_anim, true);    ta.recycle();    unitAngle = (float) (sweepAngle / 100.0);    bgPaint.setStyle(Paint.Style.STROKE);    bgPaint.setStrokeCap(Paint.Cap.ROUND);    bgPaint.setStrokeWidth(progressWidth);    progressPaint.setStyle(Paint.Style.STROKE);    progressPaint.setStrokeCap(Paint.Cap.ROUND);    progressPaint.setStrokeWidth(progressWidth);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    /*for (int i = 0, end = (int) (progress * unitAngle); i <= end; i++) {      progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));      canvas.drawArc(pRectF,          startAngle + i,          1,          false,          progressPaint);    }*/    if (!showAnim) {      curProgress = progress;    }    drawBg(canvas);    drawProgress(canvas);    if (curProgress < progress) {      curProgress++;      postInvalidate();    }  }  // 只需要画进度之外的背景即可  private void drawBg(Canvas canvas) {    float halfSweep = sweepAngle / 2;    for (int i = sweepAngle, st = (int) (curProgress * unitAngle); i > st; --i) {      if (i - halfSweep > 0) {        bgPaint.setColor(getGradient((i - halfSweep) / halfSweep, bgMidColor, bgEndColor));      } else {        bgPaint.setColor(getGradient((halfSweep - i) / halfSweep, bgMidColor, bgStartColor));      }      canvas.drawArc(pRectF,          startAngle + i,          1,          false,          bgPaint);    }  }  private void drawProgress(Canvas canvas) {    for (int i = 0, end = (int) (curProgress * unitAngle); i <= end; i++) {      progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));      canvas.drawArc(pRectF,          startAngle + i,          1,          false,          progressPaint);    }  }  public void setProgress(@IntRange(from = 0, to = 100) int progress) {    this.progress = progress;    invalidate();  }  public int getProgress() {    return progress;  }  public int getGradient(float fraction, int startColor, int endColor) {    if (fraction > 1) fraction = 1;    int alphaStart = Color.alpha(startColor);    int redStart = Color.red(startColor);    int blueStart = Color.blue(startColor);    int greenStart = Color.green(startColor);    int alphaEnd = Color.alpha(endColor);    int redEnd = Color.red(endColor);    int blueEnd = Color.blue(endColor);    int greenEnd = Color.green(endColor);    int alphaDifference = alphaEnd - alphaStart;    int redDifference = redEnd - redStart;    int blueDifference = blueEnd - blueStart;    int greenDifference = greenEnd - greenStart;    int alphaCurrent = (int) (alphaStart + fraction * alphaDifference);    int redCurrent = (int) (redStart + fraction * redDifference);    int blueCurrent = (int) (blueStart + fraction * blueDifference);    int greenCurrent = (int) (greenStart + fraction * greenDifference);    return Color.argb(alphaCurrent, redCurrent, greenCurrent, blueCurrent);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    mMeasureWidth = getMeasuredWidth();    mMeasureHeight = getMeasuredHeight();    if (pRectF == null) {      float halfProgressWidth = progressWidth / 2;      pRectF = new RectF(halfProgressWidth + getPaddingLeft(),          halfProgressWidth + getPaddingTop(),          mMeasureWidth - halfProgressWidth - getPaddingRight(),          mMeasureHeight - halfProgressWidth - getPaddingBottom());    }  }}

xml布局

<myCircle.ProgressRing  android:layout_width="320dp"  android:layout_height="320dp"  android:layout_gravity="center_horizontal"  app:pr_bg_end_color="#00ffffff"  app:pr_bg_mid_color="#CCCCCC"  app:pr_bg_start_color="#00ffffff"  app:pr_progress="70"  app:pr_progress_end_color="#F78930"  app:pr_progress_start_color="#00ffffff"  app:pr_progress_width="40dp" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表