自定义view的path梳理
基本方法
-
reset() 清除掉path里面所有线条以及曲线,但不会改变他的fill-type,不保留原有数据结构
-
rewind() 清除path里面线条和曲线,保留内部数据结构以便复用,删除fill-type(一般选择reset())
-
set(Path mPath) 用新path替换旧path
-
moveTo(float x,float y) 设置当前点位置,后面的绘制从该点开始,设置绘制起点
-
setLastPoint(300, 300) 设置上个点移动到该点处,以后从该点开始绘制
-
lineTo(float x,float y) 上次结束点连接改点,如果上次没有操作,则设置改点为绘制起点
-
close() 设置闭合路径,即连接最后一个点和第一个点,如果无法连接,则什么都不做
FILL_TYPE属性
- WINDING 默认
- EVEN_ODD 叠加的地方切割,颜色为默认白色
- INVERSE_WINDING 全部为默认白色
- INVERSE_EVEN_ODD 叠加的地方为绘制颜色,其他地方为默认白色
toggleInverseFillType()切换相反的填充模式
添加基本图形
添加圆弧,
startAngle,确定角度起始位置
sweepAngle,确定扫过的角度
public void addArc(Rectf ovel ,float startAngle,float sweepAngle)
添加圆弧,与上面方法唯一不同的是:如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
public void arcTo (RectF oval, float startAngle, float sweepAngle)
添加圆弧,是否将之前路径的结束点设置为圆弧起点
true,在新的起点画圆弧,不连接最后一个点与圆弧起点,即与之前路径没有交集(同addArc())
false,在新的起点画圆弧,连接之前路径的结束点与圆弧起点,即与之前路径有交集,(同arcTo(三参数))
public void arcTi(RectF oval, float startAngle, float sweepAngle,boolean forcemoveTo)
添加圆形,添加之后下次路径起点变为圆在X轴正方向最大的点
起点 x轴正方向的0度
坐标点
半径
dir,指定绘制时是顺时针还是逆时针,CW为顺时针,CCW为逆时针
addCircle(float x ,float y, float radius ,Path.Direction dir)
添加椭圆形路径
oval,椭圆的外切矩形区域
addOval(Rectf oval,Path.Direction dir)
加入矩形路径
路径起点变为矩形的左上角起点
addRect(Rectf oval,Path.Direction dir)
加入圆角矩形路径
添加圆形路径后会改变路径的起点
addRoundRect(Rectf oval,float x,float y,Path.Direction dir)
添加新的path
将圆形路径移动到(dx,dy),再添加到新的path内部
public void addPath(Path src, float dx, float dy)
将mPath进行Matrix变换再添加到当前path
public void addPath (Path mPath, Matrix matrix)
平移路径,与canvas的translate()类似
path.offset(float x , float y);
设置新的path路径
set(Path src)
有关布尔值操作
- 进行不同的path之间的运算
- 把简单的图形通过一定规则合成复杂的图形
对 path1 和 path2 执行布尔运算,运算方式由第二个参数指定
运算结果存入到path1中。
boolean op (Path path, Path.Op op)
path1.op(path2, Path.Op.DIFFERENCE);
对 path1 和 path2 执行布尔运算,运算方式由第三个参数指定
运算结果存入到path3中。
boolean op (Path path1, Path path2, Path.Op op)
path3.op(path1, path2, Path.Op.DIFFERENCE)
参数 | 说明 |
---|---|
DIFFERENCE | path1不同于path2的区域 |
REVERSE_DIFFERENCE | path2不同于path1的区域 |
INTERSECT | path1和path2的交集 |
UNION | path1和path2的并集 |
XOR | 减去二者交集所剩下的 |
贝塞尔曲线,通过一个数据点以及多个控制点描述
- 数据点:值路径的起始点和终止点
- 控制点:决定路径的弯曲估计
- n+1阶贝塞尔曲线=有n个控制点
- 1阶=一条直线
path方法如下:
-
绘制二阶贝塞尔曲线(x1,y1)为控制点,(x2,y2)为终点
quadTo(float x1,floaty1,float x2,float y2) -
(x1,y1)为控制点距离起点的偏移量,(x2,y2)为终点距离起点的偏移量
rQuadTo(float x1, float y1, float x2, float y2) -
绘制三阶贝塞尔曲线,(x1,y1),(x2,y2)为控制点,(x3,y3)为终点
cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) -
(x1,y1),(x2,y2)为控制点距离起点的偏移量,(x3,y3)为终点距离起点的偏移量
rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)