-
一階
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); paint.setDither(true); paint.setStrokeWidth(10); Path path = new Path(); path.moveTo(100,100); //起點 path.lineTo(700,300); //終點 canvs.drawPath(path,paint)
一階相當于畫一條直線
2 二階
//起點的位置(x,y),
path.moveTo(100,500);
//400與250表示控制點的坐標(x,y)
//700與500表示終點的坐標
//如果前面沒有設置起點,默認0,0坐標為起點
path.quadTo(400,250,700,500);
//相對于起點的位置,當前設置兩者效果相同
path.rQuadTo(300,-250,600,0);
quadTo(x1,y1,x2,y2) 方法用于絕對坐標,即上面的設置起點為100,500,控制點是從左上角算起400,250,終點同理。而 rQuadTo(x1,y1,x2,y2) 說的是相對于起點的位置,同理推算即可
3 三階
mPath.moveTo(100,700);
//絕對位置
mPath.cubicTo(250,600,500,800,700,700);
//相對位置
mPath.rCubicTo(150,-100,400,100,600,0);
三階比二階多了一個控制點而已,cubicTo(x1,y1,x2,y2,x3,y3) 也是說的絕對位置,rCubicTo(x1,y1,x2,y2,x3,y3) 為相對位置。
4 高階
/**
*創建線路
*fps 測試添加的頻率,值越大,線條越圓滑
*points 坐標集合 (4階 = 起點 + 控制點3個 + 終點),5階是4個控制點,*以此類推
*/
private Path createBezier(float fps,Point... points){
Path path = new Path();
if(points == null || points.length == 0){
return path;
}
if(fps <= 0){
fps = 1000;
}
//分別獲取 x,y 坐標
float[] xs = getXPoints(points);
float[] ys = getYPoints(points);
//起點位置
path.moveTo(xs[0],ys[0]);
float pro = 0f;
float cx = 0f;
float cy = 0f;
for(int i = 0;i <= fps; i++){
pro = i / fps;
cx = calculateBezier(pro,xs);
cy = calculateBezier(pro,ys);
path.lineTo(cx,cy);
}
return path;
}
//獲取所以的x坐標集合
private float[] getXPoints(Point... points){
float[] xs = new float[points.length];
for (int i = 0; i < xs.length; i++) {
xs[i] = points[i].x;
}
return xs;
}
//獲取所以的y坐標集合
private float[] getYPoints(Point... points){
float[] ys = new float[points.length];
for (int i = 0; i < ys.length; i++) {
ys[i] = points[i].y;
}
return ys;
}
/**
* 計算某時刻的貝塞爾坐標(x 或 y)
* @param t 時間
* @param values 集合
* @return 當前 t 時間的貝塞爾坐標點(x 或 y)
*/
private float calculateBezier(float t,float... values ){
int len = values.length;
for(int i = len - 1; i > 0; i--){
for(int j = 0; j < i; j++){
values[j] = values[j] + (values[j + 1] - values[j]) * t;
}
}
return values[0];
}
圖紅線為四階貝塞爾曲線,5階6階等等修改 Point 數組坐標數量即可