万物weiyi通过本文主要向大家介绍了Android,Canvas等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
接上篇,Android自定义View工具:Paint&Canvas(二)
上一篇中介绍的Canvas绘制图形只能画一些常规图形(圆,椭圆,矩形等),如果想绘制更复杂的图形,Path神器来了!
Path是什么?
Path类将多种复合路径(多个轮廓,如直线段、二次曲线、立方曲线)封装在其内部的几何路径。
如何绘制Path:
通过设置Paint的Style(FILL、STROKE、FILL_AND_STROKE),然后调用canvas.drawPath(path, paint);Path还可以用于剪切或者在路径上绘制文本(canvas.drawTextOnPath())。
Path有两个构造函数:
Path() // 空的构造函数 Path(Path src) //创建一个新的路径,并且从src路径里赋值内容
Path常用方法一览表:
Path常用方法 | 备注 |
---|---|
线操作 | |
lineTo、rLineTo | 绘制线 |
点操作 | |
moveTo、rMoveTo | 改变后面操作的起始点位置 |
setLastPoint | 改变前面操作中最后点的位置 |
添加常规图形 | |
addRect | 绘制矩形 |
addRoundRect | 绘制圆角矩形 |
addCircle | 绘制圆 |
addOval | 绘制椭圆 |
addArc、arcTo | 绘制圆弧 |
闭合path | |
close | 如果连接Path起点和终点能形成一个闭合图形,则会将起点和终点连接起来形成一个闭合图形 |
贝塞尔曲线 | |
quadTo、rQuadTo、cubicTo、rCubicTo | 贝塞尔曲线 |
- 线操作
lineTo(float x, float y) //添加当前点到目标点(x,y)构成的直线到path rLineTo(float dx, float dy) //基于当前坐标系,即以path最后的那个点 //为坐标系原点(0,0),如果前面没有path的点,默认是屏幕左上角(0,0).
注:lineTo、rLineTo起始点默认是屏幕左上角的坐标系原点(0,0)!
示例:
//设置Paint Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10f); //设置Path Path path = new Path(); //屏幕左上角(0,0)到(200,400)画一条直线 path.lineTo(200, 400); //(200, 400)到(400,600)画一条直线 path.lineTo(400, 600); //以(400,600)为起始点(0,0)偏移量为(400,600)画一条直线, //其终点坐标实际在屏幕的位置为(800,1200) path.rLineTo(400, 600); canvas.drawPath(path, mPaint);
效果图:
- 点操作
moveTo(float x, float y) //改变接下来操作的起点位置为(x,y) rMoveTo(float dx, float dy) //接下来要操作的起点位置为(x+dx,y+dy) setLastPoint(float dx, float dy) //改变前一步操作点的位置,会改变前一步的操作
先来看moveTo和rMoveTo的区别,示例:
//初始化Paint Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10f); //初始化Path Path path = new Path(); //将坐标系原点从(0,0)移动到(100,100) path.moveTo(100, 100); //画从(100,100)到(400,400)之间的直线 path.lineTo(400, 400); //path.rMoveTo(0, 100); //暂时注释 path.lineTo(400, 800); canvas.drawPath(path, mPaint);
效果图:
上面代码中,打开注释的path.rMoveTo(0, 100),意为下一步操作起点位置由(400,400)变为(400+0,400+100)即为(400,500),效果图: