贝塞尔风暴 - 超炫GABottleLoading效果

谈到贝塞尔曲线,很多人会觉得高逼格、复杂、头疼,实则不然,贝塞尔曲线经过android封装,已经显得娇俏可爱,简单好用,之前一些红极一时的效果也均是由其打造,比如QQ的“一键退潮”效果、电子书曲面翻页效果...... 现在咱们就用贝塞尔曲线一起从0到1打造一个拥有极致体验、清秀灵动的GABottleLoading效果;

好了,不多吹NB了,老规矩先上一个原始效果图:

如果你想看 [GAStudio Github主页][2],请戳[这里][2];
如果你想看 [GAStudio][3]更多[技术文章][3],请戳[这里][3];
欢迎加入GAStudio交流QQ群: 277582728;
[github地址:][1]https://github.com/Ajian-studio/GABottleLoading

看到这个效果,估计有人开喷:

“我擦,听你吹半天NB,这个效果老子两年前就看过了,github上早有了,垃圾......”

此时,沉稳优雅、帅气逼人的GA哥在github上通过关键字搜索,两个实现赫然出现在我的面前,看来天不助我,然后通过查看他们的实现,发现其中一个实现的很棒,老实说GA哥都没有信心实现到如此完美,but看过之后发现他是直接加载gif,fuck, too young, too simple, 另一个呢?通过代码实现,现在让我们瞻仰下他实现的效果:

从效果上来看,基本实现了瓶身、波纹晃动,但真正复杂的气泡与动态并倾斜的水面的脱离过程却并未实现,而这才是GA哥感兴趣的地方,此时天空响起一声惊雷,GA哥闪亮登场;

首先,让我们一起分解下这个动效,简单来看,该效果可以分成以下几个部分:

1.水滴从水面弹出和融入;
2.水面的波动;
3.瓶身的绘制;

接下来,咱们一起从以上三个内容逐个处理:

一、水滴从水面弹出和融入


正式分析之前,请和GA哥一起通过一个慢镜头看看其中一个水滴脱离水面的过程;



我擦,不看不知道,没想到过程如此细腻!

是不是突然感觉这个动效没那么简单了?是不是有点难度了?尤其是水滴离开水面的过程中,水面还在不断的变动,而整个水滴弹出和融入的过程都需要和水面柔和爽朗的连接;

俗话说,“擒贼先擒王”,咱们第一步就来搞定水滴的粘连出入过程!

首先我们来看一下过程分解图(请关注左边的水滴):

由上图可以观察到,到(4)的时候,水滴已经完全脱离了水面,只不过存在一定的粘连(由于水的张力);

接下来我们分析下水滴脱离水面的过程,为了更好的说明,将水面简化为一个静态的斜面,这样更加直观;

那么原始模型如下图,其中斜线代表水面,圆代表水滴,是不是很简单?

接下来我们需要考虑,如何处理水滴和水面的粘连效果,标题既然叫做贝塞尔曲线打造极致GABottleLoading效果,咱们肯定是使用贝塞尔曲线这一神器了,既然使用贝塞尔曲线,那么不用多说,就需要考虑起始点、终点、控制点这些核心数据;

从效果来看,起始点咱们可以直接从水滴上取,然而具体取到何处呢?咱们可以以水滴冒出水面的高度为基准,然后定义一个适当比例,以该比例计算具体数据点;

既然起始点在水滴上,那么终点毋庸置疑在水面上,具体取于何处呢?咱们可以采用如下方式(至于为何要这么取则是GA哥的思路):

使用一个矩形框框住水滴区域,使水滴距离左右两边 L1、L2,并且L1 == L2 ;

此时矩形框与水面形成交点w1、w2,咱们可以直接选取如图所示w1、w2作为两个终点,这两个点即表示水滴由于张力而形成的拖尾和水面的接触点;

经过以上思路,咱们画出以下图示:

看上面这张图,其中L3为水面上点w1和w2的连接线,L4为经过圆心并且和L3垂直的直线,wd为L3与L4的交点,,Ct为圆最顶端数据点,C1、C2为垂直于L4的L5与圆环的交点;

咱们将辅助线都去掉,那么就得到如下的图:

在图上,C1、C2为起始点,W1、W2为终点;

好了,起始点、终点咱们定下了确定的方法,控制点呢?

且继续看下图;

图中L6、L9分别为点w1及w2所在的水面的切线,L7、L8分别为C1及C2处的切线,q1为L6与L7的交点、q2为L8与L9的交点,q1与q2则为咱们找的两个控制点;

到此,包括起始点、终点、控制点在内的贝塞尔曲线所需的核心数据咱们就都找到了,如下图所示的6个点;

6个点、6个点、6个点,重要的事情说三遍......

然后咱们利用以上6个点绘制两条二阶贝塞尔曲线,形成相应拖尾粘连效果,具体效果图如下:

我们把不需要的点去除,并填充上颜色,看看最后的效果:

那么这部分整体效果的结果如何?请看!

这个不够直观?那让我们加上辅助点,请看!

  • 圆上的白色的点从左往右分别是c1、c2,分别表示拖尾与圆的接触点,即贝塞尔曲线的起始点;
  • 圆两侧两侧红色的点从左往右为分别为w1、w2,表示拖尾与水面的接触点,即贝塞尔曲线的终点;
  • 蓝色点从左往右分别为q1、q2,分别表示左右两侧的控制点;

最后,圆完全脱离水面如下图:

圆拖着拖尾上移:

最后拖尾断裂:

最后水滴完全脱离,水面恢复平静:

让我们一起来看看整个过程:

ok,到此,水滴从水面弹出和融入的思路分析就此结束;

二、水面的波动分析


同样,咱们先看下原始效果图:

github上已实现效果图:

没有对比就没有伤害,看起来是不是觉得原始效果图要柔和自然很多?那么到底是什么原因呢?GA哥分析主要是以下两点原因:

  • 1.波动效果,原效果图是一个减速过程,当水波达到最高点的时候速度变为了0,而对比图是一直匀速的过程;
  • 2.上面流动的水和下面静止的水的连接处理有差异;

当然,以GA哥的尿性肯定是以原效果图为目标,而当GA哥在PS中采用三阶贝塞尔曲线去拟合的时候,发现还是存在一定的瑕疵,不能完全的拟合上;

最终,最右边的连接弧度采用上图所示数据作为参数,实现的效果如下:

我擦,连接处不够柔顺,此时GA哥采用了以下处理方案;

将波动的水面抬高,和底部静止的水面保持一定的距离,然后采用二阶贝塞尔曲线将两者的连接处进行连接:

恩,上图的效果还是可以接受的,让我们看看动起来什么效果:

  • 作者注:恩,此时如GA哥的秀发般飘逸了! - GAStudio哥

三、瓶身的绘制


瓶身绘制就是一个字——"扣",扣细节,然后达到各个接触点比较完美的连接;

让我们从左半部分的上方开始讲起。

瓶口处的的弯角,一开始GA哥也是认为是一个半圆(180度),然后再连接直线。然而这样做效果不是很好,所以GA哥采用四分之一圆环(90度),然后连接45度的直线,最后连接垂直的瓶嘴直线,效果如下图:

  • 路人甲:纳尼?怎么有这么明显的棱角?作为细致的GA哥,依旧没有放过这个细节。
  • 路人乙:敢问GA哥有什么有效的方案?使用Paint.Cap.ROUND?
  • GA哥:No, No, No, Paint.Cap.ROUND 只对line的头部有效,GA哥采用了将Paint的PathEffect设置成了CornerPathEffect,那么就会将直线和直线间的连接处,自动做了圆滑处理。

那么效果如何呢?请看下图:

卧槽,好帅,好柔滑有木有!

此外,瓶身连接处(如下图红色标注处)也是需要注意的,要么计算准确,完美的连接;要么索性有一点缺口,采用arcTo绘制瓶身,此时缺口会自动连接上直线,再加上之前配置的CornerPathEffect,就会使得该处显得自然:

接着瓶身采用圆弧绘制,从多少到多少角度都需要进行计算;

最后底部采用直线直接连接;

  • GA哥: 恩,你们是不是觉得GA哥会说,右半部分和左半部分采用一样的思路?
  • 路人甲: 难道不是吗?难道GA哥有啥高招?
  • GA哥: 恩,GA哥这个人比较懒,所以什么事都想偷懒;

恩,我们都不用仔细观察,这个瓶子是左右对称的!所以直接反转过来就行了哇!

关键代码如下:

Matrix matrix = new Matrix(); 
camera.save();
camera.rotateY(HALF_FULL_ANGLE); 
camera.getMatrix(matrix); 
camera.restore(); 
matrix.preTranslate(-mViewRectF.centerX(), -mViewRectF.centerY()); 
matrix.postTranslate(mViewRectF.centerX(), mViewRectF.centerY()); 
Path rightBottlePath = new Path(); 
rightBottlePath.addPath(mBottlePath); 
mBottlePath.addPath(rightBottlePath, matrix);```

### 总结 
---
> * GA哥:总结?总结啥呢? 
> * 路人甲:看看效果呗,看你吹了这么久,哈哈! 
> * 路人乙:赞同楼上的; 
> * 路人丙:赞同楼上的; 
> * 路人丁:赞同楼上的;
> * ... 
> * GA哥:盛情难却哇,那就献丑了!  

 ![](http://upload-images.jianshu.io/upload_images/4083252-41e36c9ba39631e1?imageMogr2/auto-orient/strip)   

**最后,附上GAStudio技术交流群和Github,喜欢的话欢迎follow和star:** 

 ![](http://upload-images.jianshu.io/upload_images/4083252-5e507cb5ccb44847?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

 [github地址:][1] https://github.com/Ajian-studio/GABottleLoading  

**如果你想看 [GAStudio Github主页][2],请戳[这里][2];**  
**如果你想看 [GAStudio][3] 更多[技术文章][3],请戳[这里][3];**
**欢迎加入GAStudio交流QQ群: 277582728;**
[1]: https://github.com/Ajian-studio/GABottleLoading
[2]: https://github.com/Ajian-studio
[3]: http://blog.csdn.net/tianjian4592
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • 最近在做项目的时候,需要用到一个动画,非常简单的动画,简单到就是直接对一个View做平移... 然而虽然动画简单,...
    IAMDAEMON阅读 4,199评论 12 69
  • 贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式。 很多绘图工具中的钢笔工具,就是典...
    eclipse_xu阅读 27,515评论 38 370
  • 谈谈贝塞尔曲线 最近在做项目的时候,需要用到一个动画,非常简单的动画,简单到就是直接对一个View做平移… 然而虽...
    雨润听潮阅读 5,842评论 1 16
  • 背景: 给一系列顶点,如果只是用直线将其中的各个点依次连接起来,最终形成一个折线图,这种很容易实现。但是现实...
    狂风无迹阅读 38,112评论 12 70
  • 本文主要内容为贝塞尔曲线原理解析并用 SurfaceView 实现其展示动画 关于SurfaceView 的使用,...
    涤生_Woo阅读 13,180评论 5 94