Path
Path
又叫路径,它是一个比较重要的概念,在自定义 View 中它的重要程度基本上跟 Paint 差不多,那么它可以用来干什么勒, 可以说 Path 是万能的也不为过,为什么这么说呢,因为只要给我任何一个 Path 路径,我就能把它绘制出来。下面我们先来熟悉一下它有哪些 API 吧,请看下表:
API | 功能 | 说明 |
---|---|---|
moveTo | 移动起点 | 移动下一次操作的起点位置 |
setLastPoint | 设置终点 | 重置当前 path 中最后一个点位置,如果在绘制之前调用,效果和 moveTo 相同 |
lineTo | 连接直线 | 添加上一个点到当前点 |
close | 闭合路径 | 连接第一个点到最后一个点,形成一个闭合区间 |
addRect,addRoundRect,addOval,addCircle,addPath,addArc,arcTo | 添加内容 | 添加(矩形,圆角矩形,椭圆,圆,路径,圆弧)到当前 Path 中 |
isEmpty | 是否为空 | 判断当前 Path 是否是空的 |
isRect | 是否为矩形 | 判断 Path 是否是一个矩形 |
set | 替换路径 | 用新的路径替换到当前路径的所有内容 |
offset | 偏移路径 | 对当前路径之前的操作进行偏移(不会影响之后的操作) |
quadTo,cubicTo | 贝塞尔曲线 | 分别为二次和三次贝塞尔取消的方法 |
rMoveTo, rLineTo,rQuadTo,rCubicTo | rXXX方法 | 不带 r 的方法时基于远点的坐标系(偏移量),rXXX 方法是基于当前点坐标系(偏移量) |
setFillType, getFillType,isInverseFilltype,toggleInverseFilltype | 填充模式 | 设置,获取,判断和切换填充模式 |
incReserve | 提示方法 | 提示 Path 还有多少个点等待加入 |
op | 布尔操作 | 对2个Path进行布尔运算(取交集并集) |
computeBounds | 计算Path 的边界 | 计算边界 |
reset,rewind | 重置路径 | 清除Path中的内容,reset不保留内部数据结构,但会保留 Filltype,rewind会保留内部的数据结构,但不保留 FillType |
transform | 矩阵操作 | 矩阵变换 |
- moveTo,lineTo,setLastPoint,close
//从0.0 连接 400,600
mPath.lineTo(400f,600f)
//重置上一点相当于 0,0 到 600,200, 设置之前操作的最后一个点位置(会影响之前跟之后的起始点)
//mPath.setLastPoint(600f,200f)
//从 400,600 连接 900,100
mPath.lineTo(900f,100f)
//开始绘制
anvas!!.drawPath(mPath,mPathPaint)
我们把上面注释放开,如下代码:
//从0.0 连接 400,600
mPath.lineTo(400f,600f)
//重置上一点相当于 0,0 到 600,200, 设置之前操作的最后一个点位置(会影响之前跟之后的起始点)
mPath.setLastPoint(600f,200f)
//从 600,200 连接 900,100
mPath.lineTo(900f,100f)
//开始绘制
anvas!!.drawPath(mPath,mPathPaint)
实现效果如下:
通过上图我们发现 setLastPoint 设置了之后改变了之前的最后一次的坐标点,可以理解为更新最后一点的坐标,我们发现每次都是从坐标角 (0,0) 开始绘制,那么有没有一个方法指定从哪个起点开始绘制,正好,你可以试试 moveTo 它可以指定 path 的起点,如下代码:
//moveTo 设置起点
mPath.moveTo(600f,200f)
//从0.0 连接 400,600
mPath.lineTo(400f,600f)
mPath.lineTo(800f,300f)
//最后一点和起点封闭
mPath.close()
通过上图我们先利用 Path#moveTo
将 Path 起点设置为 (400,600) 开始绘制,最后调用了 Path#close
将为闭合的连接线闭合。
- addXxx 系列
我们就以 矩形,圆角矩形,椭圆,圆,圆弧 的顺序绘制
//Path.Direction.CW/CCW 顺时针/逆时针
//1. 添加矩形到 Path
void addRect (float left, float top, float right, float bottom, Path.Direction dir)
//2. 添加 圆角矩形到 Path
void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
//3. 添加 椭圆 到 Path
void addOval (RectF oval, Path.Direction dir)
//4. 添加 圆 到 Path
void addCircle (float x, float y, float radius, Path.Direction dir)
//5. 添加 圆弧 到 Path ,直接添加一个圆弧到path中
void addArc (RectF oval, float startAngle, float sweepAngle)
//添加一个圆弧到 path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
void arcTo (RectF oval, float startAngle, float sweepAngle)
void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
mPathPaint.textSize = 50f
//1. 添加矩形到 Path
mPath.addRect(100f,300f,400f,700f,Path.Direction.CW)//顺时针
canvas!!.drawText(“1”,200f,500f,mPathPaint)
//2. 添加 圆角矩形到 Path
mPath.addRoundRect(100f + 500,300f,1000f ,700f,30f,30f,Path.Direction.CCW)//逆时针
canvas!!.drawText(“2”,800f,500f,mPathPaint)
//3. 添加 椭圆 到 Path
mPath.addOval(100f,1300f,600f ,1000f,Path.Direction.CCW)//逆时针
canvas!!.drawTex