Path的常用方法
作用 | 相关方法 | 备注 |
---|---|---|
移动起点 | moveTo | 移动到下一次操作的起点位置 |
设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 |
直线 | lineTo | 添加上一个点到设置点之间的直线 |
使用方法
lineTo,moveTo,setLastPoint
lineTo
画一条线,到指定的点,参数为指定的点,从哪个点开始画呢?如果之前没有下笔点,则从0,0位置开始,有下笔点,则从之前path结束的位置开始,如下
Path path = new Path();
path.lineTo(200,200);
path.lineTo(200,0);
canvas.drawPath(path,paint1);
image.png
moveTo
方法名 | 简介 | 是否影响之前的操作 | 是否影响之后操作 |
---|---|---|---|
moveTo | 移动下一次操作的起点位置 | 否 | 是 |
setLastPoint | 设置之前操作的最后一个点位置 | 是 | 是 |
moveTo 只改变下一次操作的起点,开始位置是0,0,当移动到200,200,通过moveTo移动到200,100时候,下一次下笔点就是200,100,再做移动,到200,100,之后就不会产生影响,直到300,300
Path path = new Path(); // 创建Path
path.lineTo(200, 200); // lineTo
path.moveTo(200, 100); // moveTo
path.lineTo(200, 0); // lineTo
path.lineTo(300, 300);
canvas.drawPath(path, paint1);
image.png
setLastPoint是重置上一次操作的最后一个点,在执行完第一次的lineTo的时候,最后一个点是(200,200),而setLastPoint更改最后一个点为(200,100),所以在实际执行的时候,第一次的lineTo就不是从原点O到(200,200)的连线了,而变成了从原点到(200,100)之间的连线了。
Path path = new Path(); // 创建Path
path.lineTo(200, 200); // lineTo
path.setLastPoint(200, 100); // moveTo
path.lineTo(200, 0); // lineTo
path.lineTo(300, 300);
canvas.drawPath(path, paint1);
image.png
addXXX
1、基本形状
// 圆形
public void addCircle (float x, float y, float radius, Path.Direction dir)
// 椭圆
public void addOval (RectF oval, Path.Direction dir)
// 矩形
public void addRect (float left, float top, float right, float bottom, Path.Direction dir)
public void addRect (RectF rect, Path.Direction dir)
// 圆角矩形
public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
Path.Direction
类型 | 简介 |
---|---|
CW | 顺时针 |
CCW | 逆时针 |
图形在实际记录中就是记录各个的点,对于一个图形来说肯定有多个点,既然有这么多的点,肯定就需要一个先后顺序,这里顺时针和逆时针就是用来确定记录这些点的顺序的。
比如一个矩形,顺时针ABCD,逆时针ADCB
通过代码,修改最后一个点的位置,也就是用setLastPoint方法把矩形最后一个点位置修改了
顺时针
canvas.drawRect(-200,-200,200,200,paint);
Path path = new Path();
path.addRect(-200,-200,200,200, Path.Direction.CW);
path.setLastPoint(-300,300); // <-- 重置最后一个点的位置
canvas.drawPath(path,paint1);
image.png
逆时针
canvas.drawRect(-200,-200,200,200,paint);
Path path = new Path();
path.addRect(-200,-200,200,200, Path.Direction.CCW);
path.setLastPoint(-300,300); // <-- 重置最后一个点的位置
canvas.drawPath(path,paint1);
image.png
2、addArc和arcTo添加一个圆弧
// addArc
public void addArc (RectF oval, float startAngle, float sweepAngle)
public void addArc(float left, float top, float right, float bottom, float startAngle,
float sweepAngle)
// arcTo
public void arcTo (RectF oval, float startAngle, float sweepAngle)
public void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
参数 | 简介 |
---|---|
RectF | 矩形 |
left,top,right,bottom | 也就是一个矩形 |
oval | 圆弧的外切矩形 |
sweepAngle | 圆弧的角度[-360,360) |
forceMoveTo | 是否强制使用MoveTo |
从名字就可以看出,这两个方法都是与圆弧相关的,作用都是添加一个圆弧到path中,但既然存在两个方法,两者之间肯定是有区别的:
名称 | 区别 |
---|---|
addArc | 直接添加一个圆弧到path中 |
arcTo | 添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点 |
Path path = new Path();
path.lineTo(100,100);
RectF rectF = new RectF(0,0,200,200);
path.addArc(rectF,0,270); //相当于画一个矩形,在矩形中有个圆,圆弧从0°到270°
canvas.drawPath(path,paint1);
canvas.drawRect(rectF,paint);
image.png
//添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
//forceMoveTo true 不链接
//forceMoveTo false 连接
Path path = new Path();
path.lineTo(100,100);
RectF rectF = new RectF(0,0,200,200);
path.arcTo(rectF,0,180,false);
path.lineTo(300,300);
canvas.drawPath(path,paint1);
canvas.drawRect(rectF,paint);
如果是false 则连接,
image.png
true 不连接
image.png
网友评论