概要:
本人在目前项目中很多页面都需要自定义控件,所以抽出时间对自定义控件进行系统的复习,并对此发表一下本人的拙见,也方便今后复习。
学习之前先看一下,这次分享最终要做的自定义控件吧,整张图除了中间的文字是TextView 其他的都是画出来的,而且圆指向柱状体顶部的箭头是
好其他不多说开始这次的学习之旅吧!!!
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);