Path是Canvas中用來繪製「多邊形」的方法。
比如下面兩個函數分別可以畫一個三角形和五芒星:
void drawTriangle(Canvas canvas, Paint paint) {
Path path = Path();
path.moveTo(50, 50); // top vertex
path.lineTo(100, 150); // bottom right vertex
path.lineTo(0, 150); // bottom left vertex
path.close(); // back to top vertex
canvas.drawPath(path, paint);
}
void drawStar(Canvas canvas, Paint paint) {
double radius = 50;
double centerX = 100;
double centerY = 100;
Path path = Path();
for (int i = 0; i < 5; i++) {
double innerRadius = radius * (i % 2 == 0 ? 1 : 0.38);
double angle = i * 2 * pi / 5 - pi / 2;
path.lineTo(centerX + innerRadius * cos(angle), centerY + innerRadius * sin(angle));
}
path.close();
canvas.drawPath(path, paint);
}
Path的邏輯應該不難懂,就是設定起點後再依序輸入每個點,最後一個點會跟起點形成一個頭尾相連的閉環線段,進一步形成任意形狀。(但結束的方式有點奇妙,close指令似乎不是必須的,但基本上建議使用一下。)
以前,沒有OpenGL這些函數以前,軟體工程師如果要做3D繪圖,多數時候都是在跟Path打交道。
但Path最大、最有「戰略價值」的用途還不是做多邊形繪圖,而是做「裁切」。
Path trianglePath = Path();
trianglePath.moveTo(50, 50); // top vertex
trianglePath.lineTo(100, 150); // bottom right vertex
trianglePath.lineTo(0, 150); // bottom left vertex
trianglePath.close(); // back to top vertex
// Clip the canvas to the triangle path
canvas.clipPath(trianglePath);
這樣做就會將Canvas上Path外的部分切除。
將圖形做圓邊裁切的方式就是這樣。可以想像這使用量有多大嗎?