-
一阶
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 数组坐标数量即可