前言#

最近看框架和源码比较多,很久没有写动画了,相信很多的朋友都对动画感兴趣,我也不例外,毕竟做前端还是要靠动画特效吃饭的,并且比写功能模块更有成就感。

今天我们就来个稍微简单一点的CircleProgressBar热个身。

首先需要对ValueAnimator动画,还有Canvas,Paint画图的相关的类和API都有一定的了解,所以这部分还比较薄弱的朋友可以先去学习一下基础知识,否则可能会有些吃力。

正文#

先看一下效果图,我不会录屏,就百度了一张图片:

这里写图片描述

大概是这样的效果,首先我们不考虑效果,先画出这个圆形的进度条,新建文件CircleProgressBar:

/**

* 进度

*/

private float mProgress = 50;

/**

* 最大进度

*/

private int mMaxProgress = 100;

/**

* 绘制进度条

*/

private void drawProgress(Canvas canvas) {

// 开始画进度条

// 首先画出背景圆

mPaint.setColor(mBackgroundColor);

mPaint.setStyle(Paint.Style.FILL);

// 这里减去了边框的宽度

canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius - mBorderWidth, mPaint);

// 画出进度条

mPaint.setColor(mProgressBorderColor);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(mBorderWidth);

// 计算圆弧划过的角度

float angle = CIRCULAR / mMaxProgress * mProgress;

// 这里要画圆弧

canvas.drawArc(mContentRectF, -90, angle, false, mPaint);

// 画出补全部分的进度条

mPaint.setColor(mBorderColor);

mPaint.setStrokeWidth(mBorderWidth);

// 这里要画圆弧

canvas.drawArc(mContentRectF, -90 + angle, CIRCULAR - angle, false, mPaint);

}

先话出背景色的圆,然后画出进度条的颜色的边框,再画出进度条以外的部分,为了显示的明显,我分别用了三个颜色,最终的效果:

这里写图片描述

最初的样子已经出来了,但是有一个小细节要注意:

这里贴出mMaxProgress = 100,为什么不是1000,10000呢?当然也可以,但是我不推荐这个数字过大,大家可以去看看系统自带的ProgressBar,他的注释有提醒开发者,不要使用过大的max,最好是100,感兴趣的可以去看一看。

现在就差动画了,接下来我们来分析一下动画:

1、首先进度会飞快的上涨,以顺时针为方向,伸长的部分是头部。

2、然后进度会飞速的下降,以顺时针为方向,缩短的部分是尾部。

首先我们来完成第一部分:

/**

* 开始过度动画

*/

private void startIntermediateAnim() {

if (valueAnimator == null) {

valueAnimator = new ValueAnimator().ofFloat(0, mMaxProgress);

valueAnimator.setDuration(DURATION);

valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

// 设置进度

float value = (float) valueAnimator.getAnimatedValue();

setProgress(value);

}

});

valueAnimator.setRepeatCount(-1);

valueAnimator.start();

}

也是没什么太多的技术含量,但是有几点需要说明一下:

我们使用ValueAnimator().ofFloat,是为了动画的流畅性,如果你使用了int,你会发现动画会有一些细微的卡顿,因为int型舍弃了小数部分,这样就会出现误差,视觉上就会出现卡顿。

伸长的动画已经成型了,那缩短的动画不就简单了,直接动画reverse不就好了?我激动得设置了:

valueAnimator = new ValueAnimator().ofFloat(0, mMaxProgress,0);

或者是

valueAnimator.setRepeatMode(ValueAnimator.REVERSE);

我迫不及待的运行了代码,卧草草,竟然不行?仔细观察效果,我们发现了问题:

如果是缩短,还是从顺时针的头部缩短,而不是从尾部,这是为什么呢?其实从api也可以理解,因为我们是从起始位置开始画弧,只要起始位置不变,尾部肯定不会发生变化。

虽然明白了这个道理,但是心情非常的压抑,难道就要放弃了?突然灵光一闪,我发现了一个神奇的办法,不知道机智的小伙伴是不是也想到了:

还记得我之前的绘图步骤吗?

先绘制进度部分,然后剩余部分不全。

既然进度部分只能头部伸长,尾部也是一样,那我让补全部分伸长,那进度部分的尾部不就是缩短了吗?

那如何让补全部分伸长呢?

1、把progress在伸长结束时,开始让补全部分使用progress,从而让他伸长,但是这样会改变原有的功能逻辑,非常危险,工作量也大。

2、最简单的办法,把进度的颜色不补全部分的颜色交换,然后把位置也互换,不就OK了?

经过简单的修改之后:

if (valueAnimator == null) {

valueAnimator = new ValueAnimator().ofFloat(0, mMaxProgress);

valueAnimator.setDuration(DURATION);

valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

float value = (float) valueAnimator.getAnimatedValue();

setProgress(value);

}

});

valueAnimator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animator) {

}

@Override

public void onAnimationEnd(Animator animator) {

// 因为是循环动画,所以这里不会回调

}

@Override

public void onAnimationCancel(Animator animator) {

}

@Override

public void onAnimationRepeat(Animator animator) {

// 互换两者的颜色

int color = getProgressBackgroundColor();

setProgressBackgroundColor(getProgressColor());

setProgressColor(color);

}

});

}

valueAnimator.setRepeatCount(-1);

valueAnimator.start();

ok,还有谁?最关键的部分已经全部完成了,还差最后一点点,仔细的观察效果图,发现进度条是有最小进度的,没有完全消失,所以我们再设置一个最小进度,并且每次设置进度的时候,我们都稍微旋转一下角度,这样就会一边伸长缩短一边旋转了:

/**

* 开始过度动画

*/

private void startIntermediateAnim() {

if (valueAnimator == null) {

valueAnimator = new ValueAnimator().ofFloat(mMinProgress, mMaxProgress - mMinProgress);

valueAnimator.setDuration(DURATION);

valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

float value = (float) valueAnimator.getAnimatedValue();

setProgress(value);

// 每次旋转2度

mStartAngle += 2;

}

});

valueAnimator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animator) {

}

@Override

public void onAnimationEnd(Animator animator) {

}

@Override

public void onAnimationCancel(Animator animator) {

}

@Override

public void onAnimationRepeat(Animator animator) {

// 因为有了最小进度,所以每次都要位置设置到补全部分的位置

mStartAngle = mStartAngle - CIRCULAR / mMaxProgress * mMinProgress;

// 互换两者的颜色

int color = getProgressBackgroundColor();

setProgressBackgroundColor(getProgressColor());

setProgressColor(color);

}

});

}

valueAnimator.setRepeatCount(-1);

valueAnimator.start();

}

最终的效果,就想一开始的效果图一样,这里不贴了。

总结#

看上去稍微有点复杂的动画,经过我们的分析拆解,就变得很简单了。如果是利用Translation, Rotate 这样的动画,那实现起来真是太难了,ValueAnimator就是从他们中分离出来的专门用来计算差值的强大武器,有了它我们开发一些高级的效果,就简单多了。

我对demo进行了一些修改,即可以是普通的圆形进度条,也可以是loading的动画,就想progressBar一样,大家可以下载下来,参考一下。

ok,今天就到这里了,明天就是周末了,祝大家浪起来~

android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar相关推荐

  1. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  2. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

  3. android刷新时的圆形动画_【Android】圆形揭露动画

    在Android系统中提供了一种圆形的揭露动画,具体表现为一个view以圆形的形式展开.揭示.所谓揭露动画,就是一种用于 View 之间,甚至界面之间的特殊过渡动画效果.通过ViewAnimation ...

  4. android进度条动画圆环虚线,实线和虚线进度条控件 Android CircleProgressBar

    软件介绍 CircleProgressBar继承ProgressBar, 是包含实心和线条两种风格的圆环进度条. 此外, 进度值可以随意定制. 如果你对酷炫的进度条比较感兴趣, 或许你更喜欢 Load ...

  5. QGIS 3.14|地震数据动画效果实战(三)进度条设置

    在之前的版本中,QGIS对时间的处理是通过Time Manager插件实现的,QGIS 3.14将Temporal Controller引入软件整体框架之中,以原生的方式支持各类数据集对时间维度的处理 ...

  6. Android UI(四)云通讯录项目之云端更新进度条实现

    作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 36523458 ...

  7. Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条

    场景 进度条的常用场景: 通过SeekBar拖动进而更新ProgressBar进度条,比如调整音量效果等. 模拟下载实现自动更新进度条. 注: 博客: https://blog.csdn.net/ba ...

  8. Android学习笔记(Android Studio)3-3(ProgressBar ProgressDialog)(加载进度条、转圈圈)UI组件之弹出组件

    Android学习笔记3-3 推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送 3-3 ProgressBar & Progr ...

  9. 【android studio】注册广播监测网络(附加gif和菊花进度条)

    通过注册广播来监测网络的变化,包含wifi和数据网络的监测,添加了gif图片和菊花进度条.本来想上传一个完整测试的gif,但是只能上传小于5M的,哭了.下面上效果图和代码. 效果图 MainActiv ...

最新文章

  1. CPU执行指令过程与python
  2. hdfs读写流程_一文读懂HDFS分布式存储框架分析
  3. HTC vive 虚实融合
  4. 华为交换机导入配置_华为交换机配置文件导入 华为s5700交换机配置教程
  5. Java核心技术 卷I 基础知识 学习笔记(1)
  6. 网卡驱动程序igb和ixgbe
  7. mysql 分区原理_mysql 原理~ 分区表
  8. Milking Cows /// 区间计数 离散化排序 oj10105
  9. Unity Kinect体感跑酷互动游戏方案
  10. UltraEdit编辑器无法使用快捷键全选ctrl+a功能失效解决办法
  11. 开源数据库全接触-MongoDB,Cassandra,Hypertable,CouchDB,Redis,HBase,Voldemort等35款数据库简介
  12. jason by gson复习
  13. User’s Guide
  14. Windows 7 新功能 - BitLocker To Go
  15. 串口通信学习(GPS模块)2021.5.10
  16. 原生手写富文本编辑器组件
  17. 设置百度地图的缩放比例
  18. 02java进阶03-异常、线程、同步、线程池、Lambda表达式、File类、递归
  19. 学会这些Excel技巧
  20. 有什么好用的PC浏览器?

热门文章

  1. jqgrid mysql 分页_jQgrid 分页显示
  2. pxe装机dhcp获取不到_关于PXE服务器环境搭建流程中遇到的问题及解决方法
  3. php下载数据表,javascript – 如何使用php下载表数据作为excel表..?
  4. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截
  5. 三级分类菜单的数据库设计
  6. Linux下静态IP地址的设置及TFTP服务的搭建
  7. Mac OS X 10.10.3对SSD开启Trim功能
  8. 消灭编译警告(Warning)
  9. vue如何引入ant部分组件
  10. 前端学习(3252):react脚手架