波浪过程下载Loading动画
下载Loading 动画
一,简介和效果分析
二,实现过程
- 外圈背景和进度弧的绘制先看背景圆圈吧,
colorArc = Color.argb(255, 0, 150, 136);colorsoild = Color.argb(255, 173, 216, 230);colorFork = Color.argb(255, 238, 0, 0);arcPaint = new Paint();arcPaint.setAntiAlias(true);arcPaint.setColor(colorArc);arcPaint.setStrokeWidth(strokeWidth);arcPaint.setStyle(Paint.Style.STROKE);circlePaint = new Paint(arcPaint);circlePaint.setColor(colorsoild);
我们先是定义了paint,那是必须的,然后初始化,然后就在ondraw里面进行绘制了。不过还有一个重要的东西,就是圆弧的动态的啊,那是怎么做的呢,我在这是使用了属性动画,我们来看//圆圈旋转动画mRotateAnimation = ValueAnimator.ofFloat(0f, 1f);mRotateAnimation.setDuration(2000);mRotateAnimation.setRepeatCount(100);mRotateAnimation.setStartDelay(0);mRotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());mRotateAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {percent = (float) animation.getAnimatedValue();downLength = (float) animation.getAnimatedValue() * (2f * radius + 2 * dotRadius);if (downLength / waveHeight > 1.01) {if (currentProgress < maxProgress) {if (isRise) {currentProgress += 10;isRise = false;}} else {if ((float) animation.getAnimatedValue() > 0.99)mRotateAnimation.cancel();}} else {isRise = true;}invalidate();}});
我们先在只用看percent这个参数就行了,也就是说通过属性动画不停的改变percent的值来进行动态的绘制。改变值之后我们调用invalidate这个方法,让ondraw不断调用。然后就是绘制了,我们来看ondraw里的这两行,canvas.drawArc(rectF, 0, 360, false, circlePaint);canvas.drawArc(rectF, -90 - 360 * percent, -(20 + percent * 344), false, arcPaint);
这里的restF是一个绘制区域,就是定义的两个图形绘制的区域可以看到,先是绘制了一个圆圈,然后重点是后面这行,percent不断改变,圆弧两个顶点的绘制起始和快慢是不一样的,然后重点都是 - 90度方向,也就有了加载一圈的效果。 - 水波上升的效果
在讲水波绘制之前,先简单了解一下贝塞尔曲线和使用,在path的方法中有一个这样的方法,quadTopublic void rQuadTo(float dx1, float dy1, float dx2, float dy2) {isSimplePath = false;native_rQuadTo(mNativePath, dx1, dy1, dx2, dy2);}
四个参数分别是中间点和终点的坐标值。没图说个**,那我们来看一个图
现在我们可以看到通过三个点和绘制的过程,这个方法可以绘制出如图的红色线(二阶贝塞尔曲线),通过这样我们就可以绘制一条类似于正弦的上下震动的波浪线了。
还有一个就是绘制的时候我重新建了一块画布,然后画出底部圆形上面波浪的图形,怎么绘制呢,用到了这个属性,//交集上层progressPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
也就是去绘制两个图像的上面部分,相信大家应该了解,如果不了解的话可以去搜索一下,这里就不介绍了。然后绘制曲线。
//波的数量int count = (int) ((int) (bitmapWidth / 2 + 1) * 2 / space);//决定上升的高度waveHeight = (1 - (float) currentProgress / maxProgress) * bitmapHeight;path.moveTo(-bitmapWidth + waveHeight, waveHeight);//决定 曲线的弯曲程度float d = (1 - (float) currentProgress / maxProgress) * space;for (int i = 0; i < count; i++) {path.rQuadTo(space, -d, space * 2, 0);path.rQuadTo(space, d, space * 2, 0);}
先把起点移动移动到我们计算好的点,这里的space是一个我自己定的值,可以更改,这里的moveTo相当于先移动到上图的P0点,这里的rQuadTo和QuadTo的区别就是前者是相对起点的坐标,而不是相对整个画布的坐标,然后通过rQuadTo绘制第二个点也就是P1点,同理P2.现在的效果差不多就是这样的,图中参数对应变量意义。
然后不断循环这个过程知道把计算的count数量的整个波画完。 - 小球下落(强行是水滴 0.0)
水滴一直下落,所以要计算下落的距离,private float downLength; downLength = (float) animation.getAnimatedValue() * (2f * radius + 2 * dotRadius);
这里下落的时候我当做和水上升当做同步上升了,后面才发现这样并不好,但是这里水下落的最大长达是固定的,怎么样才能在水滴下落到水面的时候就让水面上升呢? 那就要看一下下面这几行代码了,
if (downLength / waveHeight > 1.01) {if (currentProgress < maxProgress) {if (isRise) {currentProgress += 10;isRise = false;}} else {if ((float) animation.getAnimatedValue() > 0.99)mRotateAnimation.cancel();}} else {isRise = true;}
如在水滴下落的距离和水面上升到的距离作比较,如果基本是同一个位置的话,直接控制水波上升,然后水波进入下一个上升等待状态。
- 动画打勾(如果是成功的结果)
首先,打勾需要一个路径,这里路径我们可以自己定义,tickPath = new Path();tickPath.moveTo(width / 2 - 0.5f * radius, height / 2);tickPath.lineTo(width / 2 - 0.5f * radius + 0.4f * radius, height / 2 + 0.3f * radius);tickPath.lineTo(width / 2 - 0.5f * radius + radius, height / 2 - 0.3f * radius);tickMeasure = new PathMeasure(tickPath, false);
这里的代码就不过所解释了,
然后就是我们的绘制过程了,我还是使用的属性动画来动态改变绘制的过程中的值。//打钩动画tickAnimation = ValueAnimator.ofFloat(0f, 1f);tickAnimation.setStartDelay(200);tickAnimation.setDuration(500);tickAnimation.setInterpolator(new AccelerateInterpolator());tickAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {tickPercent = (float) animation.getAnimatedValue();invalidate();}});
然后动态绘制的过程,这里又用到了PathMeasure,不太懂得同学可以去搜索了解一下,
canvas.drawArc(rectF, 0, 360, false, solidCirclePaint);canvas.drawArc(rectF, 0, 360, false, arcPaint);Path path = new Path();tickMeasure.getSegment(0, tickPercent * tickMeasure.getLength(), path, true);path.rLineTo(0, 0);canvas.drawPath(path, arcPaint);
效果就是这样的了
- 红叉的绘制
红叉的绘制就和勾的绘制其实是一样的,这里就不分析了。感兴趣的同学可以去看代码。这里给上代码下载地址,欢迎大家查看并给个star。
GITHUB源码下载
波浪过程下载Loading动画相关推荐
- android录音波浪动画_Android实现炫酷的波浪下载Loading动画
1. 简介和效果分析 一直都觉得有很多loading动画挺炫酷的,然后自己看过一些之后也想实现一个,加强一下对绘制view的练习,能力有限,很多地方的实现的有欠考虑和逻辑优化,不管怎么样画了两天还是把 ...
- android应用加载过程中的loading动画
应用加载过程中的loading动画: LoadingView .java /*** * loading 动画的实现 * @author * */ public class LoadingVi ...
- 分享web前端七款HTML5 Loading动画特效集锦
以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...
- 一款炫酷Loading动画--载入成功
简单介绍 昨天在简书上看到一篇文章.介绍了一个载入动画的实现过程 一款Loading动画的实现思路(一) 仅仅可惜原动画是IOS上制作的.而看了一下.作者的实现思路比較复杂,于是趁着空暇写了一个And ...
- android loading封装_我们经常用的Loading动画居然还有这种姿势
背景 Loading动画几乎每个Android App中都有. 一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验. 同样的 ...
- loading窗口动画 web_分享web前端七款HTML5 Loading动画特效集锦
以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...
- 一款炫酷Loading动画--加载失败
简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分 ...
- 一款炫酷Loading动画--加载成功
简介 昨天在简书上看到一篇文章,介绍了一个加载动画的实现过程 一款Loading动画的实现思路(一) 只可惜原动画是IOS上制作的,而看了一下,作者的实现思路比较复杂,于是趁着空闲写了一个Androi ...
- Android 常用效果(各种进度条,酷炫loading动画,火箭升空,撒花以及趋势图)...
最近时间比较充裕一些,总结了下几个项目用到的ui效果,在这边共享给大家,也给自己做个记录(后面会有demo贴出). 主要是以下几种ui效果: 进度条多种展示 开源loading动画 火箭升空 撒花效 ...
最新文章
- 美军认知技术发展态势
- C++默认构造函数的一点说明
- UI行业发展预测 系列规划的调整
- hp-ux锁定用户密码_UX设计101:提出正确的问题-规划和促进用户访谈
- android 之 百度地图
- SchemaSpy:数据库构架文档生产器,以及该软件的部分缺陷修改。提供工具包下载...
- NGUI的拖拽和放下功能的制作,简易背包系统功能(drag and drop item)
- linux jdk安装
- ADAS/AD域控制器及芯片平台分析
- 形式语言与自动机 图灵机
- 【OPNsense】广东电信拨号用户通过OPNsense获取原生IPV6地址
- 中国电信官方提醒:7类短信诈骗须警惕
- 判断当前时间是否是法定节假日或工作日
- 修改360浏览器主页
- 五险一金 | 养老保险的认识
- windows常用命令行操作及相关快捷方式
- matlab图像导数求积分_matlab微积分问题:导数、偏导数
- 程序员崩溃了!年终奖怎么说黄就黄?
- 面向鲲鹏和昇腾的创新架构
- BUUCTF qwb2018_opm