Android自定义View - Path

166 阅读4分钟

Path表示点的运行轨迹。

移动画笔到某个坐标

//移动到某个点,不绘制
void moveTo(float x, float y);

相当于把笔抬起来,移动到下一个想要绘制的地方。x为要移动到位置的横坐标,y为要移动到位置的纵坐标。

void rMoveTo(float dx, float dy);

用法和moveTo()方法类似,坐标参照点由(0,0)变更为上一步操作画笔停留的位置,你可以将其想象成(0,0)。

移动画笔画一条直线

//绘制一条直线路径
void lineTo(float x, float y);

画条线到(x,y)。

void rLineTo(float dx, float dy);

用法和lineTo()方法类似,坐标参照点由(0,0)变更为上一步操作画笔停留的位置,你可以将其想象成(0,0)。

移动画笔画一条贝瑟尔二阶曲线

//绘制一条二阶贝瑟尔曲线路径
void quadTo(float x1, float y1, float x2, float y2);

(x1,y1)为控制点的坐标,(x2,y2)为结束点的坐标。

void rQuadTo(float dx1, float dy1, float dx2, float dy2);

用法和quadTo()方法类似,坐标参照点由(0,0)变更为上一步操作画笔停留的位置,你可以将其想象成(0,0)。

移动画笔画一条贝瑟尔三阶曲线

//绘制一条三阶贝瑟尔曲线路径
void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);

(x1,y1)为第一个控制点的坐标,(x2,y2)为第二个控制点的坐标,(x3,y3)为结束点的坐标。

void rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3);

用法和cubicTo()方法类似,坐标参照点由(0,0)变更为上一步操作画笔停留的位置,你可以将其想象成(0,0)。

移动画笔画一条圆弧路径

//绘制一条圆弧路径
void arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo);

left、top、right、bottom为所绘制圆弧的限定范围。startAngle为矩形内切椭圆的旋转角的开始角度。sweepAngle为顺时针扫过的角度。forceMoveTo如果为true的话,上个阶段点的位置直接move到圆弧绘制的起始位置,反之,则还要从上个阶段点的位置绘制一条直线到圆弧的起始位置,相当于调了一次lineTo()方法。

关闭路径

//关闭路径
void close();

连接Path的起始点和结束点,组成封闭图形。

设置填充类型

//设置填充类型
void setFillType(FillType ft);

FillType有以下几个枚举值,Path.FillType.WINDING、Path.FillType.EVEN_ODD、Path.FillType.INVERSE_WINDING和Path.FillType.INVERSE_EVEN_ODD。

添加形状

//添加一个矩形的路径
void addRect(RectF rect, Direction dir);

dir有两个枚举值,Path.Direction.CW(顺时针)和Path.Direction.CWW(逆时针),这个值要起作用,需要调用canvas.drawTextOnPath()方法,否则顺时针画跟逆时针画封闭图形没区别,如果路径上有文字就不一样了,因为文字不一定占满整个封闭图形的路径。

//添加一个椭圆的路径
void addOval(RectF oval, Direction dir);

用法类似于addRect()。

//添加一个圆形的路径
void addCircle(float x, float y, float radius, Direction dir);

用法类似于addRect()。

//添加一个圆角矩形的路径
void addRoundRect(RectF rect, float rx, float ry, Direction dir);

用法类似于addRect()。

//添加一个圆弧的路径
void addArc(RectF oval, float startAngle, float sweepAngle);

startAngle为矩形内切椭圆的旋转角的开始角度。sweepAngle为顺时针扫过的角度。

//路径偏移
void offset(float dx, float dy);

dx为路径在x轴上偏移的距离,左负有正,dy为路径在y轴上平移的距离,上负下正,原路径不保留。

给路径添加路径

//给路径再添加一个路径
void addPath(Path src, float dx, float dy);

dx为路径在x轴上偏移的距离,左负有正,dy为路径在y轴上平移的距离,上负下正。参照offset()方法,偏移后多了添加一个Path的过程,但不代表坐标原点(0,0)以偏移后的位置做参照,后面添加的src不受偏移过程的影响。

检测点是否在路径范围内

boolean contains(int x, int y);

判断点P(x,y)是否在Path范围内。

boolean contains(Rect r);

判断矩形r是否属于当前Path,即r的所有点是否都落在Path范围内。