Android自定义view渐变圆形动画

 更新时间:2019年03月21日 11:30:10   作者:halaoda  
这篇文章主要为大家详细介绍了Android自定义view渐变圆形动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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" />

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

相关文章

  • Android 软键盘弹出隐藏挤压界面等各种问题小结

    Android 软键盘弹出隐藏挤压界面等各种问题小结

    这篇文章主要介绍了Android 软键盘弹出隐藏挤压界面等各种问题的相关知识,本文给大家介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-11-11
  • 解决VSCode调试react-native android项目错误问题

    解决VSCode调试react-native android项目错误问题

    这篇文章主要介绍了VSCode调试react-native android项目错误解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Android实现可折叠式标题栏

    Android实现可折叠式标题栏

    这篇文章主要为大家详细介绍了Android实现可折叠式标题栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android ExpandableRecyclerView使用方法详解

    Android ExpandableRecyclerView使用方法详解

    这篇文章主要为大家详细介绍了Android ExpandableRecyclerView的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android自定义实现可滑动按钮

    Android自定义实现可滑动按钮

    这篇文章主要为大家详细介绍了Android自定义实现可滑动的按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Android简单实现画图功能

    Android简单实现画图功能

    这篇文章主要为大家详细介绍了Android简单实现画图功能的方法,以及实现过程中遇到的问题,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Android开发中Toast显示消息的方法小结

    Android开发中Toast显示消息的方法小结

    这篇文章主要介绍了Android开发中Toast显示消息的方法,结合实例形式总结分析了Toast的功能、创建Toast对象及调用相关函数显示消息提示框的操作技巧,需要的朋友可以参考下
    2016-10-10
  • Android自动填充短信验证码功能(demo)

    Android自动填充短信验证码功能(demo)

    在项目开发中为了给用户带来极好的体验效果,通常需要实现验证码的自动填充功能,怎么实现呢?今天小编给大家分享Android自动填充短信验证码功能的实现方法,需要的朋友参考下吧
    2017-02-02
  • Android样式的开发:layer-list实例详解

    Android样式的开发:layer-list实例详解

    本文主要介绍Android样式开发layer-list,这里整理了详细的资料,及简单示例代码有兴趣的小伙伴可以参考下
    2016-09-09
  • 在Android Studio中Parcelable插件的简单使用教程

    在Android Studio中Parcelable插件的简单使用教程

    下面小编就为大家分享一篇在Android Studio中Parcelable插件的简单使用教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论