貝塞爾曲線
貝塞爾曲線是計(jì)算機(jī)圖形圖像造型的基本工具,是圖形造型運(yùn)用得最多的基本線條之一。它通過控制曲線上的四個(gè)點(diǎn)(起始點(diǎn)、終止點(diǎn)以及兩個(gè)相互分離的中間點(diǎn))來創(chuàng)造、編輯圖形。其中起重要作用的是位于曲線中央的控制線。這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點(diǎn)。移動兩端的端點(diǎn)時(shí)貝塞爾曲線改變曲線的曲率(彎曲的程度);移動中間點(diǎn)(也就是移動虛擬的控制線)時(shí),貝塞爾曲線在起始點(diǎn)和終止點(diǎn)鎖定的情況下做均勻移動。
注意,貝塞爾曲線上的所有控制點(diǎn)、節(jié)點(diǎn)均可編輯。這種“智能化”的矢量線條為藝術(shù)家提供了一種理想的圖形編輯與創(chuàng)造的工具。
Android中的Path類中提供了若干方法繪制想要的圖形。
public class MyView extends View {
private Paint paint;
private Path path;
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(10);
path = new Path();
drawLine();
}
/**
* 1.默認(rèn)從屏幕原點(diǎn)(0,0)開始繪制
*/
private void drawLine() {
path.lineTo(300, 300);
move();
}
/**
* 2.move方法主要用于移動畫筆
*/
private void move() {
path.moveTo(500, 300);
path.lineTo(800, 300);
quadTo();
}
/**
* 3.path方法中quadTo()方法提供了兩點(diǎn)間的貝塞爾曲線
* (x1,y1) 為控制點(diǎn),(x2,y2)為結(jié)束點(diǎn)。
*/
private void quadTo() {
path.quadTo(500, 400, 200, 800);
cubicTo();
}
/**
* 4.cubicTo 同樣是用來實(shí)現(xiàn)貝塞爾曲線的。
* cubicTo(float x1, float y1, float x2, float y2,float x3, float y3)
* 相較于quadTo()多了一個(gè)控制點(diǎn)
* 如果第一個(gè)起始點(diǎn)就和控制點(diǎn)一樣,則相當(dāng)于使用quaTo方法
*/
private void cubicTo() {
path.moveTo(100, 800);
path.cubicTo(100, 800, 300, 400, 600, 800);
cubicTo2();
}
/**
* 使用兩個(gè)控制點(diǎn)繪制貝塞爾曲線
*/
private void cubicTo2() {
path.moveTo(0, 0);
path.cubicTo(100, 800, 300, 400, 600, 800);
drawArcTo();
}
/**
* arcTo 用于繪制圓形或者橢圓,繪制好矩形后,選取需要到的角度
*/
private void drawArcTo() {
RectF rectF = new RectF(10, 10, 600, 600);
path.arcTo(rectF, 0, 90);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path, paint);
}
}

繪制drawArcTo
為了方便把矩形區(qū)域也截取出來了,繪制的弧線是矩形區(qū)域的中心點(diǎn)的角度。

貝塞爾曲線兩個(gè)控制點(diǎn)的曲線

貝塞爾曲線一個(gè)控制點(diǎn)的曲線

使用lineTo和moveTo方法移動畫筆