本人在开发中使用到了安卓的Cavan类,但苦于这个类的讲解并不清晰,见到一个大牛讲的很厉害,原文地址如下
http://www.myexception.cn/mobile/1799702.html
摘录一点我觉得非常有价值的:
Path是android中用来封装几何学路径的一个类,因为Path在图形绘制上占的比重还是相当大的,这里我们先来学习一下这个Path,来看看其一些具体的用法:
public class PathView extends View {
private Path mPath;// 路径对象
private Paint mPaint;// 画笔对象
public PathView(Context context, AttributeSet attrs) {
super(context, attrs);
/*
* 实例化画笔并设置属性
*/
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.CYAN);
// 实例化路径
mPath = new Path();
// 连接路径到点[100,100]
mPath.lineTo(100, 100);
}
@Override
protected void onDraw(Canvas canvas) {
// 绘制路径
canvas.drawPath(mPath, mPaint);
}
}
这里我们用到了Path的一个方法
lineTo(float x, float y)
该方法很简单咯,顾名思义将路径连接至某个坐标点,事实也是如此:
注意,当我们没有移动Path的点时,其默认的起点为画布的[0,0]点,当然我们可以通过
moveTo(float x, float y)
方法来改变这个起始点的位置:
// 实例化路径
mPath = new Path();
//移动点至[300,300]
mPath.moveTo(300, 300);
// 连接路径到点[100,100]
mPath.lineTo(100, 100);
效果如下:
当然我们可以考虑多次调用lineTo方法来绘制更复杂的图形:
// 实例化路径
mPath = new Path();
// 移动点至[300,300]
mPath.moveTo(100, 100);
// 连接路径到点
mPath.lineTo(300, 100);
mPath.lineTo(400, 200);
mPath.lineTo(200, 200);
一个没有封闭的类似平行四边形的线条:
如果此时我们想闭合该曲线让它变成一个形状该怎么做呢?聪明的你一定想到
mPath.lineTo(100, 100)
然而Path给我提供了更便捷的方法
close()
去闭合曲线:
// 实例化路径
mPath = new Path();
// 移动点至[300,300]
mPath.moveTo(100, 100);
// 连接路径到点
mPath.lineTo(300, 100);
mPath.lineTo(400, 200);
mPath.lineTo(200, 200);
// 闭合曲线
mPath.close();
quadTo(float x1, float y1, float x2, float y2)
可以让我们绘制二阶贝赛尔曲线,什么叫
贝赛尔曲线?其实很简单,使用三个或多个点来确定的一条曲线,贝塞尔曲线在图形图像学中有相当重要的地位,Path中也提供了一些方法来给我们模拟低阶贝赛尔曲线。
贝塞尔曲线的定义也比较简单,你只需要一个起点、一个终点和至少零个控制点则可定义一个贝赛尔曲线,当控制点为零时,只有起点和终点,此时的曲线说白了就是一条线段,我们称之为
PS:以下图片和公式均来自维基百科和互联网
一阶贝赛尔曲线
其公式可概括为:
其中B(t)为时间为t时点的坐标,P0为起点、Pn为终点
贝塞尔曲线于1962年由法国数学家Pierre Bézier第一次研究使用并给出了详细的计算公式,So该曲线也是由其名字命名。Path中给出的quadTo方法属于
二阶贝赛尔曲线
二阶贝赛尔曲线的一个明显特征是其拥有一个控制点,大家可以这样想想贝赛尔曲线,在一根两端固定橡皮筋上有一块磁铁,现在我们拿另一块磁铁去吸引橡皮筋上的磁铁,因为引力,橡皮筋会随着我们手上磁铁的移动而改变形状,又因为橡皮筋的张力让束缚在橡皮筋上的磁铁不会轻易吸附到我们手上的磁铁,这时橡皮筋的状态就可以看成是一条贝塞尔曲线,而我们手中的磁铁就是一个控制点,通过这个控制点我们“拉扯”橡皮筋的曲度。
二阶贝赛尔曲线的公式为:
同样的,Path中也提供了三阶贝塞尔曲线的方法cubicTo,按照上面我们的推论,三阶应该是有两个控制点才对对吧
三阶贝赛尔曲线
公式: