这个系列主要是介绍下Android自定义View和Android绘图机制,自己能力有限,如果在介绍过程中有什么错误,欢迎指正
作用 | 相关方法 | 备注 |
---|---|---|
移动起点 | moveTo | 移动下一次操作的起点位置 |
设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 |
连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path |
闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 |
添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) |
是否为空 | isEmpty | 判断Path是否为空 |
是否为矩形 | isRect | 判断path是否是一个矩形 |
替换路径 | set | 用新的路径替换到当前路径所有内容 |
偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) |
贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 |
rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | 不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量) |
填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 |
提示方法 | incReserve | 提示Path还有多少个点等待加入(这个方法貌似会让Path优化存储结构) |
布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) |
计算边界 | computeBounds | 计算Path的边界 |
重置路径 | reset, rewind | 清除Path中的内容 reset不保留内部数据结构,但会保留FillType. rewind会保留内部的数据结构,但不保留FillType |
矩阵操作 | transform | 矩阵变换 |
绘制直线需要了解以下几个方法:
void moveTo (float x1, float y1):直线的开始点;即将直线路径的绘制点定在(x1,y1)的位置;
void lineTo (float x2, float y2):直线的结束点,又是下一次绘制直线路径的开始点;lineTo()可以一直用;
void close ():如果连续画了几条直线,但没有形成闭环,调用Close()会将路径首尾点连接起来,形成闭环;
OK,接下来我们就实际操作下
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);//填充样式改为描边
paint.setStrokeWidth(5);//设置画笔宽度
paint.setColor(Color.BLUE);
Path path = new Path();
path.moveTo(100, 100);//以(100,100)为起点
path.lineTo(100, 500);//从(100,100)到(100.500)绘制一条直线
path.lineTo(500, 500);//从(100,500)到(500,500)绘制一条直线
path.close();//闭环
canvas.drawPath(path, paint);
}
效果图
绘制方法:
void addRect (float left, float top, float right, float bottom, Path.Direction dir)
void addRect (RectF rect, Path.Direction dir)
这里Path类创建矩形路径的参数与上篇canvas绘制矩形差不多,唯一不同的一点是增加了Path.Direction参数;
Path.Direction有两个值:
Path.Direction.CCW:是counter-clockwise缩写,指创建逆时针方向的矩形路径;
Path.Direction.CW:是clockwise的缩写,指创建顺时针方向的矩形路径;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);//填充样式改为描边
paint.setStrokeWidth(5);//设置画笔宽度
paint.setColor(Color.BLUE);
//第一个逆向生成
Path CCWRectpath = new Path();
RectF rect1 = new RectF(50, 50, 240, 200);
CCWRectpath.addRect(rect1, Path.Direction.CCW);
//第二个顺向生成
Path CWRectpath = new Path();
RectF rect2 = new RectF(290, 50, 480, 200);
CWRectpath.addRect(rect2, Path.Direction.CW);
canvas.drawPath(CCWRectpath, paint);
canvas.drawPath(CWRectpath, paint);
}
绘制方法:
void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
这里有两个构造函数,部分参数说明如下:
第一个构造函数:可以定制每个角的圆角大小:
float[] radii:必须传入8个数值,分四组,分别对应每个角所使用的椭圆的横轴半径和纵轴半径,如{x1,y1,x2,y2,x3,y3,x4,y4},其中,x1,y1对应第一个角的(左上角)用来产生圆角的椭圆的横轴半径和纵轴半径,其它分别代表左下,右下,右上
第二个构造函数:只能构建统一圆角大小
float rx:所产生圆角的椭圆的横轴半径;
float ry:所产生圆角的椭圆的纵轴半径
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置Paint
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);//填充样式改为描边
paint.setStrokeWidth(5);//设置画笔宽度
paint.setColor(Color.BLUE);
Path path = new Path();
RectF rect1 = new RectF(50, 50, 240, 200);
//所有圆角大小相同
path.addRoundRect(rect1, 10, 15 , Path.Direction.CCW);
RectF rect2 = new RectF(290, 50, 480, 200);
//指定四个圆角不同大小
float radii[] ={10,15,20,25,30,35,40,45};
path.addRoundRect(rect2, radii, Path.Direction.CCW);
canvas.drawPath(path, paint);
}
绘制方法
void addCircle (float x, float y, float radius, Path.Direction dir)
参数说明:
float x:圆心X轴坐标
float y:圆心Y轴坐标
float radius:圆半径
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(5);
Path path=new Path();
path.addCircle(500,500,200, Path.Direction.CCW);
canvas.drawPath(path,paint);
}
效果图
绘制方法
void addOval (RectF oval, Path.Direction dir)
参数说明:
RectF oval:生成椭圆所对应的矩形
Path.Direction :生成方式,与矩形一样,分为顺时针与逆时针
Paint paint=new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(5);
Path path=new Path();
RectF rect = new RectF(100, 109, 200, 300);
path.addOval(rect, Path.Direction.CCW);
canvas.drawPath(path,paint);
绘制方法
void addArc (RectF oval, float startAngle, float sweepAngle)
参数:
RectF oval:弧是椭圆的一部分,这个参数就是生成椭圆所对应的矩形;
float startAngle:开始的角度,X轴正方向为0度
float sweepAngel:持续的度数;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(5);
Path path=new Path();
RectF rect=new RectF(100,100,200,300);
path.addArc(rect,0,180);
canvas.drawPath(path,paint);
}
Github地址