Android 贝塞尔曲线实战之网易云音乐鲸云特效,2024年最新kotlin极简教程

三阶贝塞尔曲线

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

最后的红色曲线是由蓝色一阶曲线获得的,而蓝色一阶曲线又是由绿色一阶曲线获得,最后的绿色一阶曲线则是最外的 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环绕效果。

第一点实现比较简单。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

《507页Android开发相关源码解析》

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
[外链图片转存中…(img-AUukjwXX-1712608770359)]

《507页Android开发相关源码解析》

[外链图片转存中…(img-FJjRpWQZ-1712608770360)]

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Q6iWndNZ-1712608770360)]

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值