概要:

本人在目前项目中很多页面都需要自定义控件,所以抽出时间对自定义控件进行系统的复习,并对此发表一下本人的拙见,也方便今后复习。

学习之前先看一下,这次分享最终要做的自定义控件吧,整张图除了中间的文字是TextView 其他的都是画出来的,而且圆指向柱状体顶部的箭头是


Android path 绘制路径 android:pathpattern_android路径

好其他不多说开始这次的学习之旅吧!!!


Path类


首先看一下Path类官方说明


* The Path class encapsulates compound (multiple contour) geometric paths
 * consisting of straight line segments, quadratic curves, and cubic curves.
 * It can be drawn with canvas.drawPath(path, paint), either filled or stroked
 * (based on the paint's Style), or it can be used for clipping or to draw
 * text on a path.



路径类封装化合物(多线)的几何路径由直线段组成,二次曲线,三次曲线。它可以绘制drawpath(路径,油漆),任一填充或魔方(基于涂料的风格),或可用于裁剪或画




(一)获取Path

Path path = new Path();



(二)Path的API




//扇形路径,一个椭圆,起始角,扇形角度
		path.addArc(oval, startAngle, sweepAngle);
		
		//正圆路径
		path.addCircle(x, y, radius, dir);
		
		//画椭圆
		path.addOval(oval, dir);
		
		//路径拼接路径
		path.addPath(src);
		
		//路径拼接路径+矩阵
		path.addPath(src, matrix);
		
		//路径
		path.addPath(src, dx, dy);
		
		//矩形路径 + 拼接路径
		path.addRect(rect, dir);
		
		//矩形路径上下左右 + 拼接路径
		path.addRect(left, top, right, bottom, dir);
		
		//圆角矩形路径
		path.addRoundRect(rect, rx, ry, dir);
		
		//圆形矩阵路径,通过radii数组设置某一个角的弧度
		path.addRoundRect(rect, radii, dir);
		
		//添加指定的弧路径作为一个新的轮廓。如果路径的开始是从不同的电流路径的最后一点,
		//然后自动lineto()添加连接当前轮廓弧线的开始。然而,如果路径是空的,那么我们称moveto()与圆弧的第一点
		path.arcTo(oval, startAngle, sweepAngle);
		
		//添加指定的弧路径作为一个新的轮廓。如果路径的开始是从不同的电流路径的最后一点,
		//然后自动lineto()添加连接当前轮廓弧线的开始。然而,如果路径是空的,那么我们称moveto()与圆弧的第一点。360。
		path.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
		
		//使最后一个点与第一个点闭合
		path.close();
		
		//计算路径的控制点的范围,并把答案写在界限。如果路径中包含0或1点,边界设置为(0,0,0,0)
		path.computeBounds(bounds, exact);
		
		//添加一个三次Bezier从最后一点,接近控制点(X1,Y1),(X2,Y2),
		//和结束(X3,Y3)。如果没有moveto()调用了这个轮廓,第一点是自动设定为(0,0)
		path.cubicTo(x1, y1, x2, y2, x3, y3);
		
		//返回路径的填充类型
		path.getFillType();
		
		//提示路径准备加入更多的点。这可以让道路更有效地分配存储
		path.incReserve(extraPtCount);
		
		//判断路径是否为空
		path.isEmpty();
		
		//如果filltype是反向变异返回true
		path.isInverseFillType();
		
		//如果路径指定一个矩形返回true。如果是这样的话,如果参数不为空,设置正确的路径的界限。如果路径不指定一个矩形,矩形和忽略返回false。
		path.isRect(rect);
		
		//添加了最后一点线指定点(x,y)。如果没有moveto()调用了这个轮廓,第一点是自动设定为(0,0)。
		path.lineTo(x, y);
		
		//设置的下一个路径的开始点(x,y)。
		path.moveTo(x, y);
		
		//抵消(dx,dy)的路径,成功返回TRUE
		path.offset(dx, dy);
		
		//抵消(dx,dy)的路径,成功返回TRUE
		path.offset(dx, dy, dst);
		
		path.op(path, op);
		path.op(path1, path2, op);
		
		//增加二次Bezier从最后一点,接近控制点(X1,Y1),(X2,Y2和结束)。
		//如果没有moveto()调用了这个轮廓,第一点是自动设定为(0,0)。
		path.quadTo(x1, y1, x2, y2);
		
		//cubicto相同,但坐标认为相对于当前点的轮廓。如果没有以前的点,然后移动到(0,0)是自动插入。
		path.rCubicTo(x1, y1, x2, y2, x3, y3);
		
		//从路径中的任何直线和曲线,使空。这并不改变填充类型设置。
		path.reset();
		
		//倒回路径:清除所有的直线和曲线的路径,但保持内部数据结构更快的重用。
		path.rewind();
		
		//同LineTo,但坐标认为相对于这个轮廓上点。如果没有以前的点,然后移动到(0,0)是自动插入。
		path.rLineTo(dx, dy);
		
		//组相对于以前的轮廓上下点轮廓开始。如果没有以前的轮廓,这被视为moveto()相同。
		path.rMoveTo(dx, dy);
		
		//quadto相同,但坐标认为相对于这个轮廓上点。如果没有以前的点,然后移动到(0,0)是自动插入。
		path.rQuadTo(dx1, dy1, dx2, dy2);
		
		//SRC的内容替换的内容。
		path.set(src);
		
		//设置路径的填充类型
		path.setFillType(ft);
		
		//设置路径最后一定的位置
		path.setLastPoint(dx, dy);
		
		//切换的filltype逆状态
		path.toggleInverseFillType();
		
		//点此路径的变换矩阵。
		path.transform(matrix);
		
		//变换的点在该路径的矩阵,并把答案写在DST。如果测试是无效的,那么原来的路径修改。
		path.transform(matrix, dst);