本文实例为大家分享了android自定义view绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下
在平面内任选 3 个不共线的点,依次用线段连接。
在第一条线段上任选一个点 d。计算该点到线段起点的距离 ad,与该线段总长 ab 的比例。
根据上一步得到的比例,从第二条线段上找出对应的点 e,使得 ad:ab = be:bc。
连接这两点 de。
从新的线段 de 上再次找出相同比例的点 f,使得 df:de = ad:ab = be:bc。
到这里,我们就确定了贝塞尔曲线上的一个点 f。接下来,请稍微回想一下中学所学的极限知识,让选取的点 d 在第一条线段上从起点 a 移动到终点 b,找出所有的贝塞尔曲线上的点 f。所有的点找出来之后,我们也得到了这条贝塞尔曲线。
回过头来看这条贝塞尔曲线,为了确定曲线上的一个点,需要进行两轮取点的操作,因此我们称得到的贝塞尔曲线为二次曲线(这样记忆很直观,但曲线的次数其实是由前面提到的伯恩斯坦多项式决定的)。
三个点的基本关系如下:
android 的path类提供了绘制二阶贝塞尔曲线的方法,使用方法如下:
public class curveview extends view{ private float msupx; private float msupy; private int mwidth; private int mheight; private paint mpaint; private path mpath; public curveview(context context) { super(context); } public curveview(context context, attributeset attrs) { super(context, attrs, 0); mpaint = new paint(); mpaint.setstyle(paint.style.stroke); mpaint.setstrokewidth(10); mpath = new path(); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { int widthsize = measurespec.getsize(widthmeasurespec); int widthmode = measurespec.getmode(widthmeasurespec); int heightsize = measurespec.getsize(heightmeasurespec); int heightmode = measurespec.getmode(heightmeasurespec); if (widthmode == measurespec.exactly) { mwidth = widthsize; } if (heightmode == measurespec.exactly) { mheight = heightsize; } setmeasureddimension(mwidth, mheight); } @override protected void ondraw(canvas canvas) { mpath.reset(); mpath.moveto(mwidth / 5, mheight / 2); //设置起点 mpath.quadto(msupx, msupy, mwidth * 4 / 5, mheight / 2); //设置辅助点和终点 canvas.drawpath(mpath, mpaint); canvas.drawpoint(msupx, msupy, mpaint); super.ondraw(canvas); } @override public boolean ontouchevent(motionevent event) { switch (event.getaction()){ case motionevent.action_move: msupx = event.getx(); msupy = event.gety(); invalidate(); } return true; } }
draw以后效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。