开始之前
要说自定义控件里比较逼格高的,莫属贝塞尔曲线做出的特效了,例如最常见的QQ粘性气泡,以及水波加载动画,反弹的小球,等等,看起来特别的炫酷,当然了水波动画的实现方法有好几种,这里主要记录以贝塞尔曲线的方式如何实现,开始之前,了解下基础知识,以及几个关键API:
1.快速熟悉贝塞尔
按控制点个数分为一阶贝塞尔曲线有0个控制点,二阶贝塞尔曲线有1个控制点,三阶2个控制点,四阶3个控制点,当然还有更多控制点的更多阶,不过在安卓开发中,用的3个已经是极限了,因为随着控制点增加,cpu要做的运算量呈指数增长,为了保证性能,最好将控制点使用保证在2个以下,3个不是不可以,如果是看效果还好,但是不建议在实际开发中应用,一般来说,3阶贝塞尔曲线已经够用了,足以满足绝大部分场景需求。
如果你了解PS,就很容易理解贝塞尔曲线是怎么画出的了,不了解PS也没关系,看下面几个图就明白了,比较简单:
一阶贝塞尔因为没有控制点,看起来其实就是一条直线。这里就不画图了。
二阶贝塞尔有一个控制点,在PS里用钢笔工具可以很形象的看到其结构,如图:
三阶贝塞尔曲线,2个控制点,一个在上,一个在下:
2.关键API
在自定义View中,绘制的坐标系是以屏幕左上角为原点(0,0),向右向下为正方向,如果我们想画一个2阶贝塞尔曲线,首先我们要一个画笔paint,一个路径path,然后可以画画了,
path.moveTo(startX,startY);
path.quadTo(controlX,controlY,endX,endY);
然后在ondraw()方法中就可以画出来了:
示例代码如下:
path.moveTo(100,100);
path.quadTo(300,20,500,100);
就这样,一个二阶贝塞尔曲线就画出来了:
三阶贝塞尔用的是:cubicTo(x1,y1,x2,y2,x3,y3);其中,x1,y1是第一个控制点,x2,y2是第二个控制点,x3,y3是终点。
path.moveTo(100,100);
path.cubicTo(300,20,500,180,800,