Android中贝塞尔曲线的使用

时间:2022-10-17 05:46:40

Android中主要在onDraw方法中使用quadTo & cubicTo 画二次和三次贝塞尔曲线;

绘制贝塞尔曲线一般会结合moveTo一起使用,

    path.reset();
path.moveTo(start.x,start.y);
path.quadTo(control.x,control.y,end.x,end.y);
canvas.drawPath(path, mPaint);

//二阶1个控制点,三阶2个控制点.
path.moveTo(start.x, start.y);
path.cubicTo(control1.x, control1.y, control2.x,control2.y, end.x, end.y);

使用中,我们常常不仅仅是画一条曲线,而是曲线和直线一起拼图/剪切画布。这里着重提一下ClipPath切了画布后有锯齿,从How to draw smooth / rounded path? 获取解决方案是,在drawBitmap的同时也drawPath,让圆滑的path补贴锯齿边缘,就光滑了.

    mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(8);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setPathEffect(new CornerPathEffect(10));
mPaint.setAntiAlias(true);

path.reset();
path.moveTo(0, 0);
path.lineTo(start.x, start.y);
path.quadTo(control.x, control.y, end.x, end.y);
path.lineTo(end.x, 0);
path.lineTo(0, 0);
canvas.drawPath(path, mPaint);

mPaint.setColor(mColor);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
canvas.clipPath(path);//裁剪画布
canvas.drawBitmap(bitmap,null,rect,mPaint);

应该还有其他方式去掉锯齿,弄明白了后续补充。


关于贝塞尔曲线的来龙去脉、计算公式等等,前人有好的图文,不在这里粘贴了,见参考文献。
文献1讲解的比较全面实用,直接链接过去看就行,文献2让自己动手画线有点趣味性,文献5和6是实例可以练手。

参考文献:
1.Path之贝塞尔曲线 这一篇非常适合进入状态,看了就懂,看了就能上手做;
2.The Bezier Game 这里可以练习photoshop(sketch)这些绘图软件中的钢笔工具(Vector),自己动手连线,体会贝塞尔曲线的形成 (画不出来好揪心,对于控制点把握不好);
3.基于贝塞尔曲线的Android动画差值器 介绍了贝塞尔曲线的由来,算法公式,动画差值器的代码实现;
4.Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
5.三次贝塞尔曲线练习之弹性的圆 是个好玩的实例;
6.MetaballLoading 另一个实例;
7.如何获取控制点 * How to create circle with Bézier curves?, 不得不说,数学是美的。