开发环境

  1. Android Studio 3.6.3

前言

在APP开发的时候,UI的效果图里提供了一个比较炫酷的进度条效果,琢磨着找了几篇资料实现了。

效果预览

先来看下Demo的效果,实际效果会比这更好看

开始

下面开始一步一步实现这个效果,要想实现这个效果分为两步:

  1. 实现左侧波浪形的进度
  2. 实现从右侧跑向左侧的气泡

实现从右侧跑向左侧气泡

现在将会用到二阶贝塞尔曲线,先来了解一下二阶贝塞尔曲线

参考这个链接:https://www.jianshu.com/p/03fdcfd3ae9c

这里有两个知识点:

  1. 如何用Canvas绘制出一条二阶贝塞尔曲线,Canvas没有直接的接口来绘制二阶贝塞尔曲线,需要通过Canves.drawPath()方法来绘制二阶贝塞尔曲线
/**
* Draw the specified path using the specified paint. The path will be filled or framed based on
* the Style in the paint.
*
* @param path The path to be drawn
* @param paint The paint used to draw the path
*/
public void drawPath(@NonNull Path path, @NonNull Paint paint)

Path里通过cubicTo添加二阶贝塞尔曲线,二阶贝塞尔曲线需要四个点,但是cubicTo方法只需要传入三个点,因为默认起点为(0,0)

/**
* Add a cubic bezier from the last point, approaching control points
* (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been
* made for this contour, the first point is automatically set to (0,0).
*
* @param x1 The x-coordinate of the 1st control point on a cubic curve
* @param y1 The y-coordinate of the 1st control point on a cubic curve
* @param x2 The x-coordinate of the 2nd control point on a cubic curve
* @param y2 The y-coordinate of the 2nd control point on a cubic curve
* @param x3 The x-coordinate of the end point on a cubic curve
* @param y3 The y-coordinate of the end point on a cubic curve
*/
public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);

绘制一条完整的贝塞尔曲线代码如下

path.reset();
path.moveTo(start.x * width, start.y * height);
path.cubicTo(control1.x * width, control1.y * height, control2.x * width, control2.y * height, end.x * width, end.y * height);
canvas.drawPath(path, linePaint);
  1. 还有一个给你一个进度,如何在这条二阶贝塞尔曲线上找到一个对应的点

这里我引用https://www.jianshu.com/p/03fdcfd3ae9c里面的一段文字

简单来说,就是给定几个点,计算出一个曲线.(其实复杂得我看不懂)

简单了解贝塞尔曲线后,发现**三次方贝塞尔曲线
** 符合我们的要求
公式:

拿到了公式,先不要着急,我们先思考一下,明确一下它的参数是干什么的:
公式中需要四个P,P0,是我们的起点,P3是终点,P1,P2是途径的两个点
而t则是我们的一个因子,取值范围是0-1,熟悉动画的同学应该就明白,0-1,对动画的作用有多么重大!!!所以看到这个,真是笑了~~

上面介绍的是三阶贝塞尔曲线的公式,二阶贝塞尔曲线的公式也是一样的,然后根据这个可以写出二阶贝塞尔曲线的动画点的计算公式,然后通过Canvas.drawCircle()方法来绘制指定点

final float p_1_t = 1 - t;
final float p_1_t_2 = (float) Math.pow(p_1_t, 2);
final float p_1_t_3 = (float) Math.pow(p_1_t, 3);
final float t = this.t;
final float t_2 = (float) Math.pow(t, 2);
final float t_3 = (float) Math.pow(t, 3);
final float t_p_1_t_2 = t * p_1_t_2;
final float t_2_p_1_t = t_2 * p_1_t;final float x = start.x * p_1_t_3 + 3 * control1.x * t_p_1_t_2 + 3 * control2.x * t_2_p_1_t + end.x * t_3;
final float y = start.y * p_1_t_3 + 3 * control1.y * t_p_1_t_2 + 3 * control2.y * t_2_p_1_t + end.y * t_3;
canvas.drawCircle(x * width, y * height, radiusRatio * height, circlePaint);

来看看效果

可以看到现在气泡会沿着二阶贝塞尔曲线的路径运动,二阶贝塞尔曲线是随机生成的,所以气泡会随机的从右边飘向左边。

波浪效果

要绘制一个波浪效果,原理还是很简单,就是通过绘制一个固定的波浪,然后通过Canvas.translate()的偏移来实现波浪的运动效果

参考这篇文章https://www.jianshu.com/p/34bbcd80dc7a

Canvas没有直接绘制曲线的方法,我们可以通过Canvas.drawPath()来绘制正弦曲线,通过Path.rQuadTo()方法来添加一条曲线,这里要使用Path.rQuadTo()而不是Path.quadTo()方法,Path.rQuadTo()绘制的时候使用的是相对坐标,Path.quadTo()绘制的时候使用的绝对坐标

/**
* Same as quadTo, but the coordinates are considered relative to the last
* point on this contour. If there is no previous point, then a moveTo(0,0)
* is inserted automatically.
*
* @param dx1 The amount to add to the x-coordinate of the last point on
*            this contour, for the control point of a quadratic curve
* @param dy1 The amount to add to the y-coordinate of the last point on
*            this contour, for the control point of a quadratic curve
* @param dx2 The amount to add to the x-coordinate of the last point on
*            this contour, for the end point of a quadratic curve
* @param dy2 The amount to add to the y-coordinate of the last point on
*            this contour, for the end point of a quadratic curve
*/
public void rQuadTo(float dx1, float dy1, float dx2, float dy2);

绘制一个波浪的代码如下

@UiThread
public void onDraw(Canvas canvas) {canvas.translate(0, -waveOffsetRatio * height);// 波长final float waveLength = height / WAVE_COUNT;// 振幅final float waveAmplitude = WAVE_AMPLITUDE_RATIO * waveLength;final float progressWidth = waveAmplitude + progress * width;path.reset();path.moveTo(0, 0);path.rLineTo(progressWidth, 0);final int realWaveCount = (int) Math.ceil(WAVE_COUNT + 1f);for (int i = 0; i < realWaveCount; i++) {path.rLineTo(0, 0);path.rQuadTo(waveAmplitude, waveLength / 4, 0, waveLength / 2);path.rLineTo(0, 0);path.rQuadTo(-waveAmplitude, waveLength / 4, 0, waveLength / 2);}path.rLineTo(-progressWidth, 0);path.close();canvas.drawPath(path, paint);waveOffsetRatio += MIN_WAVE_OFFSET_RATIO;if (waveOffsetRatio > 1) {waveOffsetRatio = 0;}
}

来看下效果

然后组合下就看到文章开始的效果了。

源码参考

https://github.com/bajingxiaozi/ProgressDemo

参考资料

https://blog.csdn.net/oushangfeng123/article/details/50545453

https://blog.csdn.net/qq_31715429/article/details/54386934

https://www.jianshu.com/p/03fdcfd3ae9c

https://www.jianshu.com/p/34bbcd80dc7a

从零开始实现一个基于贝塞尔曲线的进度条动画相关推荐

  1. IOS贝塞尔曲线圆形进度条和加载动画

    做项目让做一个加载动画,一个圈圈在转中间加一个图片,网上有好多demo,这里我也自己写了一个,中间的图片可加可不加.其中主要用到贝塞尔曲线.UIBezierPath是对CGContextRef的进一步 ...

  2. ios弧形进度条_IOS贝塞尔曲线圆形进度条和加载动画-阿里云开发者社区

    做项目让做一个加载动画,一个圈圈在转中间加一个图片,网上有好多demo,这里我也自己写了一个,中间的图片可加可不加.其中主要用到贝塞尔曲线.UIBezierPath是对CGContextRef的进一步 ...

  3. 一种基于贝塞尔曲线的终端定位轨迹拟合方法

    一种基于贝塞尔曲线的终端定位轨迹拟合方法 专利名称一种基于贝塞尔曲线的终端定位轨迹拟合方法 技术领域本发明属于卫星导航领域,具体涉及一种基于贝塞尔曲线的终端定位轨迹拟合方法. 背景技术目前有很多设备( ...

  4. opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

    教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...

  5. html进度条圆圈渐变色,HTML5 canvas带渐变色的圆形进度条动画

    jquery-circle-progress是一款带渐变色的圆形进度条动画特效jQuery插件.该圆形进度条使用的是HTML5 canvas来绘制圆形进度条及其动画效果,进度条使用渐变色来填充,效果非 ...

  6. android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...

    在网上翻阅了很多关于ProgressBar滚动效果,但是始终没有找到适合项目中的这种效果,故自己写这篇文章,记录一下写作过程,给大家做一个参考.先看下最终效果效果图 我这里用的是LICEcap软件录制 ...

  7. 9款极具创意的HTML5/CSS3进度条动画

    今天我们要分享9款极具创意的HTML5/CSS3进度条动画,这些进度条也许可以帮你增强用户交互和提高用户体验,喜欢的朋友就收藏了吧. 1.HTML5/CSS3图片加载进度条 可切换多主题 今天要分享的 ...

  8. html5圆形提交按钮样式,HTML5 SVG带圆形进度条动画的提交按钮特效

    这是一款非常实用的HTML5 SVG带圆形进度条动画的提交按钮特效.该提交按钮在被点击之后,按钮变形为一个圆形的进度条,当进度条运行一周之后,可以设置提交成功和提交失败的两种按钮状态. 制作方法 HT ...

  9. canvas画板涂鸦动画进度条动画

    目录 什么是 canvas 画板涂鸦动画 进度条动画 写在最后 什么是 canvas canvas 是 HTML5 新定义的标签,通过使用脚本(通常是 JavaScript)绘制图形.允许脚本语言动态 ...

最新文章

  1. java在何时获得对象的确切类型_JAVA面试题(1)
  2. react: menuService
  3. 【体验】说好的千元开发板,实用党体验单板机先驱者——Leez P710
  4. SQL Server-事务处理(Tansaction)与锁(Lock)
  5. linux下创建用户及组
  6. Android基于mAppWidget实现手绘地图(三)--环境搭建
  7. runtime相关知识
  8. SVN 本地文件锁/服务端文件锁清除步骤
  9. Windows监听进程是否退出C++
  10. 登录文件传输服务器,生信小技巧之:在本地与服务器间快速传输文件,无密码登录远端服务器...
  11. 域环境安装企业从属CA两种方法
  12. 一网打尽软件测试面试必问的所有Web测试点,你不知道的这都有!
  13. Python绘制数码管(系统时间)
  14. iphone抓包调试神器—Stream安装和使用
  15. 基于Vue的单页面格式化数据高亮编辑器组件:兼容json/xml/html/txt多种格式
  16. 720-C语言实现2048游戏
  17. 【2023秋招】10月8日美团校招两道题
  18. Linux crontab 定时执行任务
  19. Redis连接报错【redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password 】
  20. scrapy使用用Xpath提取深层标签

热门文章

  1. 商品入库异步任务实现
  2. 目标检测中的Two-stage的检测算法
  3. 如何安装centos详细步骤
  4. 企业电子招标采购系统源码+项目说明+功能描述+Spring Cloud + Spring Boot 前后端分离
  5. RocketMQ-Streams架构设计浅析
  6. 《英国ICO:匿名化、假名化及隐私增强技术指南草案》解读
  7. 关于安卓智能聊天机器人simsimi的实现方法
  8. 军工企业信息化建设周涛_关于军工企业信息化建设的思考
  9. 管理类全系书单,速速码住(50本书籍全部附送!)
  10. JSR303及其实现