一阶这个比较简单,因为没有在网上找到可以直接输入数学公式的工具,就手工推导了下。

![在这里插入图片描述](https://img-

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整资料开源分享

blog.csdnimg.cn/20191227162611692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTg2Ng==,size_16,color_FFFFFF,t_70)

最后的公式为 B(t)=(1-t)Po+tP1,t->[0,1]

二阶贝塞尔曲线

先看动画效果。

关注红线部分,这条线就是我们单位时间内运行的贝塞尔曲线效果图。这条红线实际上是由无数个点组成,随着 t 的不断变化,红线的转换过程非常的顺滑。

最后得到的公式如下:

贝塞尔曲线的绘制,无论多少阶(一阶除外),均需要逐级降阶,最终降至一阶。在 “二阶贝塞尔曲线解析” 这段文字中,从 第一步 到 第二步 的过程就是在降阶。贝塞尔曲线最终的路径是由 一阶基线 上游走的红色小点形成的。

三阶贝塞尔曲线

有了二阶的推导过程,三阶的推导就容易多啦。由于篇幅限制,推导过程这里不再展开,大家有兴趣的话可以自行推导下。

最后的红色曲线是由蓝色一阶曲线获得的,而蓝色一阶曲线又是由绿色一阶曲线获得,最后的绿色一阶曲线则是最外的 P0,P1,P2,P3构成的。动画效果为:

四阶贝塞尔曲线

五阶贝塞尔曲线

结论我们发现原来贝塞尔曲线上的点与高数中二项式展开一样,对于每个线段上的点经过控制点进行切面操作,而连续的两点之间是无限接近的,所以在绘制的过程中会出现非常丝滑地过度。

贝塞尔曲线在 Android 上的使用

在Android 中使用贝塞尔曲线比较简单,Android 已经内置了贝塞尔曲线的 API,开发者可以直接予以调用。主要有两个 API 。

quadTo

Path path = new Path(); path.moveTo(startX, startY);

path.quadTo(eventX, eventY, endX, endY);

canvas.drawPath(path, paint);

其中 (startX,startY) 为起点,(endX,endY)为终点,而 (eventX,eventY)即为控制点了。

cubicTo

Path path = new Path();

path.moveTo(startX, startY);

path.cubicTo(leftX, leftY, rightX, rightY, endX, endY);

canvas.drawPath(path, paint);

调用此方法即可画出一条三阶贝塞尔曲线。(startX,startY)为起点,(endX,endY)为终点,而(leftX,leftY)与(rightX,rightY) 为两个控制点了。

多阶贝塞尔曲线:Android 系统最高只能画出三阶的贝塞尔曲线,那么想画出更高阶的怎么办呢?其实也很简单。如果真的需要使用高阶的曲线,可以进行人工降阶,降阶到 3 级即可。

实战

=====================================================================

终于到实战环节了,该环节共有两个demo。一个是贝塞尔曲线拟圆效果,另一个是仿网易云音乐里面的鲸云效果。

效果实现1:以贝塞尔曲线画圆为例

前文总结了贝塞尔曲线的通用公式。在网上浏览资料的过程中我们发现有这么一个公式:(4/3)tan(π/(2n)),其意义是由n段三阶贝塞尔曲线拟合圆形时,曲线端点到该端点最近的控制点的最佳距离是(4/3)tan(π/(2n))。大家感兴趣的话可以自行推导。推导过程并不复杂,因为贝塞尔曲线有个重要的性质,即曲线方程中t=0.5时的点一定落在圆弧上。只需要把坐标系带入到三阶方程式即可。

最后得知当 t=0.5,根据圆形方程式 X2+Y2=R^2 ,得到h=(4/3)(sqrt(2)-1) ≈ 0.552284749831 。有了上述的理论基础,再去画圆就非常的轻松,我们先在草稿纸中得到这么一个模型。

根据上图,这个圆是由 4 段三阶贝塞尔曲线构成的,分别是 P0->P3,P3->P6,P6->P9,P9->P11。三阶贝塞尔曲线的构图是 Android 内置的,我们直接调用API 即可,核心代码如下:

public HeartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context)

}

@Override

protected void init(Context context) {

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setColor(Color.RED);

mPaint.setStyle(Paint.Style.FILL);

mPath = new Path();

//绘制 12 个点。

mCurPointList = new ArrayList<>();

mCurPointList.add(new PointF(0, dpToPx(-89)));

mCurPointList.add(new PointF(dpToPx(50), dpToPx(-89)));

mCurPointList.add(new PointF(dpToPx(90), dpToPx(-49)));

mCurPointList.add(new PointF(dpToPx(90), 0));

mCurPointList.add(new PointF(dpToPx(90), dpToPx(50)));

mCurPointList.add(new PointF(dpToPx(50), dpToPx(90)));

mCurPointList.add(new PointF(0, dpToPx(90)));

mCurPointList.add(new PointF(dpToPx(-49), dpToPx(90)));

mCurPointList.add(new PointF(dpToPx(-89), dpToPx(50)));

mCurPointList.add(new PointF(dpToPx(-89), 0));

mCurPointList.add(new PointF(dpToPx(-89), dpToPx(-49)));

mCurPointList.add(new PointF(dpToPx(-49), dpToPx(-89)));

}

@Override

protected void onDraw(Canvas canvas) {

drawCoordinate(canvas);

canvas.translate(mWidth / 2, mHeight / 2);

mPath.reset();

for (int i = 0; i < 4; i++) {

if (i == 0) {

mPath.moveTo(mCurPointList.get(i * 3).x, mCurPointList.get(i * 3).y);

} else {

mPath.lineTo(mCurPointList.get(i * 3).x, mCurPointList.get(i * 3).y);

}

int endPointIndex;

if (i == 3) {

endPointIndex = 0;

} else {

endPointIndex = i * 3 + 3;

}

mPath.cubicTo(mCurPointList.get(i * 3 + 1).x, mCurPointList.get(i * 3 + 1).y,

mCurPointList.get(i * 3 + 2).x, mCurPointList.get(i * 3 + 2).y,

mCurPointList.get(endPointIndex).x, mCurPointList.get(endPointIndex).y);

}

canvas.drawPath(mPath, mPaint);

}

}成果展示

效果实现2:以网易云音乐鲸云效果为例

转换成 GIF,图片可能会有点失真,但并不妨碍具体实现思路。根据这个 GIF,我们发现有三点功能需要去完成:

1.背景色与歌曲图片相搭配,随图片的变化而变化;

2.歌曲中间图片是一张圆形图片并且可以自动旋转;

3.图形外圈有动感 3D环绕效果。

第一点实现比较简单。

第二点也不难。我们可以把一张图片裁剪成圆形,也可以使用 GitHub 上现有的开源库,再加上一个属性动画代码。

最后

分享一份NDK基础开发资料

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

旋转;

3.图形外圈有动感 3D环绕效果。

第一点实现比较简单。

第二点也不难。我们可以把一张图片裁剪成圆形,也可以使用 GitHub 上现有的开源库,再加上一个属性动画代码。

最后

分享一份NDK基础开发资料

[外链图片转存中…(img-PBookVLs-1640922785382)]

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

Android 贝塞尔曲线实战之网易云音乐鲸云特效,2021程序员进阶宝典相关推荐

  1. Android 贝塞尔曲线实战之网易云音乐鲸云特效

    作者:哈哈将 -个推 Android 高级开发工程师 前言 APP开发市场已经告别"野蛮生长"时代,人们不再满足于APP外形创新,而将目光转向全方面的用户体验上.在这过程中,动效化 ...

  2. Android 贝塞尔曲线实战之网易云音乐鲸云特效,apm性能监控系统

    小说阅读 APP 的翻页效果. 简介 ===================================================================== 在开始实战之前,我们还 ...

  3. 模仿网易云音乐鲸云特效动效

    JinyunEffect 项目地址:tyhjh/JinyunEffect  简介: 模仿网易云音乐鲸云特效动效 更多:作者   提 Bug 标签: # Android 粒子特效--网易云鲸云特效 文 ...

  4. 【canvas】网易云音乐鲸云动效『水晶音波』的简单实现

    最近闲来无事,打开网易云音乐,发现还有鲸云音效这种东西,嗯?『水晶音波』,挺炫.嗯?黑胶VIP专享?(其实我已经是黑胶VIP)好像实现起来也不很复杂呀,所以花了一下午,实现了一个简单版本. 这是网易云 ...

  5. 仿网易云音乐鲸云音效-孤独星球

    闲来无事,打开网易云音乐,发现播放音乐时有好几款音效,属实夺人眼球,而网易云上的孤独星球音效是要vip权限才能开启的,这就让人不爽了,不想花钱那就手动撸一个出来自己边看边听歌,哇咔咔咔.由于是本人原创 ...

  6. 网易云音乐动效Android,Web Audio在音频可视化中的应用(网易云音乐鲸云动效)...

    本文有两个关键词:音频可视化和Web Audio.前者是实践,后者是其背后的技术支持. Web Audio 是很大的知识点,本文会将重点放在如何获取音频数据这块,对于其 API 的更多内容,可以查看 ...

  7. vue+elementUI实战之网易云音乐--半月总结!!!

    vue+elementUI实战之网易云音乐--半月总结!!! 模仿网易云音乐pc端 项目搭建 基本项目 引入项目中使用的东西------axios,element-Ul 遇到的问题 播放音乐 路由跳转 ...

  8. 网易云音乐测试“云随机”播放功能 已注册产品功能相关专利

    近日,网易云音乐"随机播放"功能全面升级为"云随机",该功能已在灰度测试,将于近期全量上线.网易云音乐"云随机"功能,支持用户对随机播放模式 ...

  9. uniapp 仿网易云音乐播放器 微信小程序

    效果视频: uniapp 仿照网易云播放器功能 效果截图: 上代码: <template><view class=""><scroll-view :s ...

最新文章

  1. untitled与前端——初学
  2. 电脑计算机无法找到脚本文件夹,我的电脑开机为什么出现无法找到脚本呢?
  3. python获取当前窗口句柄_人生苦短,我学python之python+selenium 多窗口、句柄(handle)...
  4. 【学习笔记】19、模快(Module)
  5. propattr区别和用法,以多选框为例
  6. linux程序 option,long-option.c/解析命令行参数
  7. JDK1.8简单配置环境变量---两步曲
  8. [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
  9. js中定义变量的符号
  10. 计算机用户名登录取消,win7系统取消登录界面显示用户名的还原办法
  11. KGB知识图谱充分发挥海量数据处理优势
  12. Debian10校准时间同步系统时间和硬件时间的方法
  13. 鼠标右键转圈圈_了解原理并解决鼠标右键转圈圈
  14. 《前端单位和网络地址》随手学习笔记
  15. 批量创建Azure DevOps Server 的账户
  16. 软件的版权和专利辨析
  17. 【卷积神经网络】卷积层,池化层,全连接层
  18. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
  19. AAAI 2018 杰出论文出炉,两位中国留学生共同获奖
  20. SAP 获取本机信息(IP及电脑名称)

热门文章

  1. ArcEngine ISymbol效果预览
  2. 网络编程 2 套接字socket
  3. 装修后才知道的79件事,无数网友真金白银砸出来...
  4. 手Q游戏中心上线 完美释放娱乐基因
  5. CTeX下载安装步骤
  6. PDFbox-PDF解析(坐标定位,分页读取)
  7. IOS-升级102 全局监听SendEvent
  8. Cloudreved云盘搭建及配置Aria2离线下载
  9. Android WIFI认证的流程
  10. python求斜边上的高是多少厘米_已知一个直角三角形的两条直角边,如何求斜边上的高的长度...