Path基本操作
-Path常用方法
作用 | 相关方法 | 备注 |
---|---|---|
移动起点 | moveTo | 移动下一次操作的起点位置 |
设置终点 | setLastPoint | 重置当前path中最后一个点的位置 |
连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path |
闭合路径 | close | 连接第一个点到最后一个点,形成一个闭合区域 |
添加内容 | addRect,addRoundRect, addOval,addCircle,addPath ,addArc,arcTo |
添加矩形,圆角矩形,椭圆,圆,路径,圆弧到当前Path(注意addArc和arcTo的区别) |
是否为空 | isEmpty | 判断Path是否为空 |
是否为矩形 | isRect | 判断Path是否为一个矩形 |
替换路径 | set | 用新的路径替换到当前路径的所有内容 |
偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) |
-Path方法详解
请关闭硬件加速以避免不必要的问题
第一组
public void lineTo(float x, float y)
public void moveTo(float x, float y)
public void setLastPoint(float dx, float dy)
public void close()
代码:
canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path(); // 创建Path
path.lineTo(200, 200); // lineTo
//path.moveTo(200,100); //下图1
//path.setLastPoint(200,100); //下图2
path.lineTo(200,0); // lineTo
path.close();
canvas.drawPath(path, mPaint); // 绘制Path
结果:
第二组
//圆形
public void addCircle(float x, float y, float radius, Path.Direction dir)
//椭圆
public void addOval(RectF rect, Path.Direction dir)
//矩形
public void addRect(RectF rect, Path.Direction dir)
//圆角矩形
public void addRoundRect(RectF rect, float rx,float ry, Path.Direction dir)
// path 将2个Path合并为一个
public void addPath(Path src)
public void addPath(Path src, float dx, float dy) //位移后合并
public void addPath(Path src,Matrix matrix)
path.addRect(-200,-200,200,200, Path.Direction.CW);
path.setLastPoint(-300,300);
path.addRect(-200,-200,200,200, Path.Direction.CW);
Path src = new Path();
src.addCircle(0,0,100, Path.Direction.CW);
path.addPath(src,0,-200);
canvas.drawPath(path,mPaint);
//圆弧
public void addArc(RectF rect, float startAngle,float sweepAngle) //等价于arcTo的forceMoveTo为true!
public void arcTo(RectF rect, float startAngle,float sweepAngle) //默认forceMoveTo为false!!!
public void arcTo(RectF rect, float startAngle,float sweepAngle,boolean forceMoveTo)
此处对说明有疑问,根据实测,
为true时最后一个点会移动至圆弧终点而不是起点
为false时,首先连接圆弧起点与当前最后一点,而后最后一点移动至圆弧终点
canvas.translate(getWidth()/2,getHeight()/2);
canvas.scale(1,-1); //翻转y轴,变为熟悉的数学坐标
Path path = new Path();
path.lineTo(50,50);
RectF rectF = new RectF(0,0,100,100);
path.addArc(rectF,0,270);
//path.arcTo(rectF,0,270);
path.lineTo(150,0);
canvas.drawPath(path,mPaint);
第三组
//Path是否包含内容
public boolean isEmpty()
//Path是否是矩形,若是,则将矩形信息存放至rect
public boolean isRect(RectF rect)
// 赋值新path 相当于path=src
public void set(Path src)
//offset
public void offset (float dx, float dy)
public void offset (float dx, float dy, Path dst)
//offset栗子
canvas.translate(mWidth / 2, mHeight / 2); // 移动坐标系到屏幕中心
canvas.scale(1,-1); // <-- 注意 翻转y坐标轴
Path path = new Path(); // path中添加一个圆形(圆心在坐标原点)
path.addCircle(0,0,100, Path.Direction.CW);
Path dst = new Path(); // dst中添加一个矩形
dst.addRect(-200,-200,200,200, Path.Direction.CW);
path.offset(300,0,dst); // 平移
canvas.drawPath(path,mPaint); // 绘制path
mPaint.setColor(Color.BLUE); // 更改画笔颜色
canvas.drawPath(dst,mPaint); // 绘制dst
虽然我们在dst中添加了一个矩形,但是并没有表现出来,所以,当dst中存在内容时,dst中原有的内容会被清空,而存放平移后的path