曲靖做网站/搜索引擎优化排名品牌
Path是绘制复杂图形的关键,除了常规之外图形都是由Path绘制
- Path Api
- 绘制
- 线
- void lineTo(float x, float y)
- void rLineTo(float dx, float dy)
- lineTo 例
- 类型
- rLineTo 例
- 为什么呢?第三个点呢,为什么不跟之前的点连成一片?
- 点
- void moveTo(float x, float y)
- void rMoveTo(float dx, float dy)
- void setLastPoint(float dx, float dy)
- 圆
- void addCircle(float x, float y, float radius, @NonNull Direction dir)
- 椭圆
- void addOval(float left, float top, float right, float bottom, @NonNull Direction dir)
- void addOval(@NonNull RectF oval, @NonNull Direction dir)
- 例
- 矩形
- void addRect(float left, float top, float right, float bottom, @NonNull Direction dir)
- void addRect(@NonNull RectF rect, @NonNull Direction dir)
- 圆角矩形
- void addRoundRect(float left, float top, float right, float bottom, float rx, float ry,@NonNull Direction dir)
- void addRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Direction dir)
- void addRoundRect(float left, float top, float right, float bottom,@NonNull float[] radii, @NonNull Direction dir)
- void addRoundRect(@NonNull RectF rect, @NonNull float[] radii, @NonNull Direction dir)
- 例
- 弧
- void addArc(float left, float top, float right, float bottom, float startAngle,float sweepAngle)
- void addArc(@NonNull RectF oval, float startAngle, float sweepAngle)
- 例
- void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle)
- void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle,boolean forceMoveTo)
- 例
- void arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo)
- 闭合
- 例
- 在路径上绘制字
- void drawTextOnPath(@NonNull char[] text, int index, int count, @NonNull Path path,float hOffset, float vOffset, @NonNull Paint paint)
- void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset,float vOffset, @NonNull Paint paint)
- 例
Path Api
绘制
canvas.drawPath(path, paint);//绘制路径canvas.drawTextOnPath() //用于作为参数,绘制字
线
void lineTo(float x, float y)
@params x
以原点(0,0)为中心点,水平偏移x
@params y
以原点(0,0)为中心点,水平偏移y
用途:将坐标点(x,y)加入到 path 中,绘制的时候,会取出path中最后一个点。绘制到当前坐标(x,y)点。
void rLineTo(float dx, float dy)
@params dx
以path中的最后一个点为中心点,水平偏移dx距离
@params dy
以path中的最后一个点为中心点,竖直偏移dy距离
用途:以path中的最后一个点为中心点,找到位置(dx,dy)的坐标点,两点绘制线;需要注意的是我们的中心点是以path中的最后一个点为中心点,所以如果path的最后一个点是(x,y),那么我们的坐标点(dx,dy)的位置实际相对于(0,0)的初始坐标点的偏移量是:
x偏移 = dx + x ; y偏移 = dy + y .
lineTo 例

Path path2 = new Path();path2.lineTo(50, 100);path2.lineTo(200, 200);canvas.drawPath(path2, paintText);
画笔类型是:paintText.setStyle(Paint.Style.STROKE);
描边
如果把画笔类型改成填充:paintText.setStyle(Paint.Style.FILL);
,绘制效果将会发生变化:
类型 FILL_AND_STROKE
:

类型
-
paint.setStyle(Paint.Style.STROKE);
描边 -
paint.setStyle(Paint.Style.FILL);
填充 -
paint.setStyle(Paint.Style.FILL_AND_STROKE);
不关注~
rLineTo 例

Path path2 = new Path();path2.lineTo(50, 100);path2.lineTo(200, 200);path2.rLineTo(200, 200);canvas.drawPath(path2, paintText);
修改画笔效果为填充后,效果:

为什么呢?第三个点呢,为什么不跟之前的点连成一片?
答:因为之前的点是以(0,0)为中心点;而我们第三个点的中心点是path的最后一个点,所以呢,中心点不一致,是不会有填充效果的哦。
类型 FILL_AND_STROKE
:

点
void moveTo(float x, float y)
@params x
以原点(0,0)为中心点,水平偏移x
@params y
以原点(0,0)为中心点,水平偏移y
用途:移动坐标点到坐标(x,y)的位置

void rMoveTo(float dx, float dy)
@params dx
以path中的最后一个点为中心点,水平偏移dx距离
@params dy
以path中的最后一个点为中心点,竖直偏移dy距离
用途:移动坐标点到坐标(dx,dy)的位置,需要注意的是我们的中心点是以path中的最后一个点为中心点,所以如果path的最后一个点是(x,y),那么我们的坐标点(dx,dy)的位置实际相对于(0,0)的初始坐标点的偏移量是:
x偏移 = dx + x ; y偏移 = dy + y .

void setLastPoint(float dx, float dy)
@params dx
以原点(0,0)为中心点,水平偏移dx距离
@params dy
以原点(0,0)为中心点,竖直偏移dy距离
作用:替换path上一步操作的坐标点
如果上一步操作是 lineTo
,setLastPoint(float dx, float dy)中的dx,dy会替换 lineTo
中的原坐标,上一步操作就会变成lineTo
(float dx, float dy)的结合,如下:
Path path2 = new Path();path2.lineTo(50, 100);path2.lineTo(200, 200);path2.setLastPoint(100,200);
可以看到坐标点(200, 200)并没有被画到画布中,最后一个坐标点变成了(100,200)。
如果上一步操作是 moveTo
,setLastPoint(float dx, float dy)中的dx,dy会替换 moveTo
中的原坐标,上一步操作就会变成moveTo
(float dx, float dy)的结合,如下:

Path path2 = new Path();path2.lineTo(50, 100);path2.moveTo(200, 200);path2.setLastPoint(100,200);path2.lineTo(300,300);canvas.drawPath(path2, paintText);
这里的代码和上面相比做了两步修改,可以看到我们的moveTo的操作确实是,确实是没有到(200, 200)点,而是到了(100,200),因为我多添加的一步操作,证实了这点。
圆
void addCircle(float x, float y, float radius, @NonNull Direction dir)
@params x
以原点(0,0)为中心点,圆心的x轴方向偏移量
@params y
以原点(0,0)为中心点,圆心的y轴方向偏移量
@params radius
半径
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
椭圆
void addOval(float left, float top, float right, float bottom, @NonNull Direction dir)
@params left
@params top
@params right
@params bottom
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
void addOval(@NonNull RectF oval, @NonNull Direction dir)
@params oval
包含椭圆的上下左右信息
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
例

Path path23 = new Path();path23.addCircle(300, 300, 50, Path.Direction.CW);path23.addOval(50, 200, 350, 400, Path.Direction.CW);RectF rectF1 = new RectF(50, 400, 350, 600);path23.addOval(rectF1, Path.Direction.CW);canvas.drawPath(path23, paintText);
矩形
void addRect(float left, float top, float right, float bottom, @NonNull Direction dir)
@params left
@params top
@params right
@params bottom
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
void addRect(@NonNull RectF rect, @NonNull Direction dir)
@params rect
包含椭圆的上下左右信息
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
圆角矩形
void addRoundRect(float left, float top, float right, float bottom, float rx, float ry,@NonNull Direction dir)
@params left
@params top
@params right
@params bottom
@params rx
椭圆圆角的横轴半径
@params ry
椭圆圆角的纵轴半径
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
void addRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Direction dir)
@params rect
@params rx
椭圆圆角的横轴半径
@params ry
椭圆圆角的纵轴半径
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
void addRoundRect(float left, float top, float right, float bottom,@NonNull float[] radii, @NonNull Direction dir)
@params left
@params top
@params right
@params bottom
@params radii
矩形四个椭圆圆角的横轴半径和纵轴半径的数组,一共8个数值,依次为左上角,右上角,右下角,左下角的rx,ry
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
void addRoundRect(@NonNull RectF rect, @NonNull float[] radii, @NonNull Direction dir)
@params rect
@params radii
矩形四个椭圆圆角的横轴半径和纵轴半径的数组,一共8个数值,依次为左上角,右上角,右下角,左下角的rx,ry
@params Direction dir
Path.Direction.CCW 沿逆时针方向绘制;Path.Direction.CW 沿顺时针方向绘制。
例

paintText.setStyle(Paint.Style.STROKE);Path path234 = new Path();RectF rectF2 = new RectF(50, 200, 350, 400);path234.addRect(rectF2, Path.Direction.CW);RectF rectF22 = new RectF(50, 450, 350, 650);path234.addRoundRect(rectF22,50,10, Path.Direction.CW);canvas.drawPath(path234, paintText);
弧
void addArc(float left, float top, float right, float bottom, float startAngle,float sweepAngle)
@params left
规定区域
@params top
规定区域
@params right
规定区域
@params bottom
规定区域
@params startAngle
起始角度
@params sweepAngle
旋转角度,旋转角度为正,会顺时针绘制;旋转角度为负,会逆时针绘制。
void addArc(@NonNull RectF oval, float startAngle, float sweepAngle)
@params oval
规定区域
@params startAngle
起始角度
@params sweepAngle
旋转角度,旋转角度为正,会顺时针绘制;旋转角度为负,会逆时针绘制。
例

Path path1 = new Path();RectF rectF32 = new RectF(50, 200, 350, 400);path1.addArc(rectF32, 0, 320);RectF rectF322 = new RectF(50, 450, 350, 650);path1.addArc(rectF322, 320, -30);canvas.drawPath(path1, paintText);
void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle)
@params oval
规定区域
@params startAngle
起始角度
@params sweepAngle
旋转角度,旋转角度为正,会顺时针绘制;旋转角度为负,会逆时针绘制。
和上面的方法void addArc(@NonNull RectF oval, float startAngle, float sweepAngle)
实现效果一致
void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle,boolean forceMoveTo)
@params oval
规定区域
@params startAngle
起始角度
@params sweepAngle
旋转角度,旋转角度为正,会顺时针绘制;旋转角度为负,会逆时针绘制。
@params forceMoveTo
是否强制将path最后一个点移动到圆弧起点。true是强制移动,即为不连接两个点。false则连接两个点。
例

Path path1 = new Path();path1.lineTo(400,400);RectF rectF32 = new RectF(50, 200, 350, 400);path1.arcTo(rectF32,0, 320,true);canvas.drawPath(path1, paintText);
当将forceMoveTo修改成false:

void arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo)
@params left
规定区域
@params top
规定区域
@params right
规定区域
@params bottom
规定区域
@params startAngle
起始角度
@params sweepAngle
旋转角度,旋转角度为正,会顺时针绘制;旋转角度为负,会逆时针绘制。
@params forceMoveTo
是否强制将path最后一个点移动到圆弧起点。true是强制移动,即为不连接两个点。false则连接两个点。
闭合
path.close();
用途:连接起始点和终止点,形成闭合图形
例

Path path1 = new Path();path1.lineTo(400,400);RectF rectF32 = new RectF(50, 200, 350, 400);path1.arcTo(rectF32,0, 320,false);path1.close();canvas.drawPath(path1, paintText);
在上面代码中添加上,path1.close();
,可以看到,我们原点(0,0)起始点和椭圆的终止点进行了直线连接,形成了闭环。
这就是它的作用。
在路径上绘制字
void drawTextOnPath(@NonNull char[] text, int index, int count, @NonNull Path path,float hOffset, float vOffset, @NonNull Paint paint)
@params char[] text
文字内容,类型是 char[]
,可以 string.toCharArray()
获取
@params index
指的是 char[]
中的起始位置,从第几个字符开始写,初始位置是0
@params count
指的是从起始位置开始,往后写,一共写几个字符,包含起始位置的字符
@params path
Path可以看成复杂图形,可以代表所有
@params hOffset
沿路径添加到文本起始位置的距离
@params vOffset
上面(-)或下面(+)的距离用于定位文本的路径
@params paint
画笔
void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset,float vOffset, @NonNull Paint paint)
@params text
文字内容
@params path
Path可以看成复杂图形,可以代表所有
@params hOffset
沿路径添加到文本起始位置的距离
@params vOffset
上面(-)或下面(+)的距离用于定位文本的路径
@params paint
画笔
例

Path path1 = new Path();path1.lineTo(400, 400);RectF rectF32 = new RectF(50, 200, 350, 400);path1.arcTo(rectF32, 0, 320, false);canvas.drawPath(path1, paintText);canvas.drawTextOnPath("ahahhahaha,so ku a !", path1, 50, 50, paintText);