2016-05-01 02:24:12 +08:00
|
|
|
|
# Path之玩出花样
|
|
|
|
|
|
|
|
|
|
|
|
### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop)
|
|
|
|
|
|
### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView)
|
|
|
|
|
|
|
|
|
|
|
|
经历过前两篇 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 和 [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 的讲解,本篇正式进入Path的收尾篇,通过使用前面的内容和本文新学的内容,教大家如何将玩转Path,玩出花样。
|
|
|
|
|
|
|
|
|
|
|
|
******
|
2016-05-02 06:31:52 +08:00
|
|
|
|
|
|
|
|
|
|
## 一.Path常用方法表
|
|
|
|
|
|
> 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。
|
|
|
|
|
|
|
|
|
|
|
|
作用 | 相关方法 | 备注
|
|
|
|
|
|
--- | --- | ---
|
|
|
|
|
|
移动起点 | 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相当于重置到new Path阶段,rewind会保留Path的数据结构**)
|
|
|
|
|
|
矩阵操作 | transform | 矩阵变换
|
2016-05-16 19:59:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
2016-05-17 02:42:44 +08:00
|
|
|
|
## 二、Path方法详解
|
|
|
|
|
|
|
|
|
|
|
|
### rXxx方法
|
|
|
|
|
|
|
2016-05-17 22:26:58 +08:00
|
|
|
|
此类方法可以看到和前面的一些方法看起来很像,只是在前面多了一个r,那么这个rXxx和前面的一些方法有什么区别呢?
|
|
|
|
|
|
|
2016-05-18 01:15:50 +08:00
|
|
|
|
> 区别就在于rXxx方法是基于当前点的位移距离,而之前的方法是基于坐标原点的位移距离(即当前坐标系的坐标)
|
|
|
|
|
|
|
2016-05-18 13:09:38 +08:00
|
|
|
|
**举个例子:**
|
2016-05-18 01:15:50 +08:00
|
|
|
|
|
2016-05-18 13:09:38 +08:00
|
|
|
|
``` java
|
|
|
|
|
|
Path path = new Path();
|
|
|
|
|
|
|
|
|
|
|
|
path.moveTo(100,100);
|
|
|
|
|
|
path.lineTo(100,100);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
在这个例子中,先移动点到坐标(100,100)处,之后再连接 _点(100,100)_ 到 _(100,100)_ 之间点直线,由于线点起点和终点相同,所以在屏幕上不会绘制出任何内容,接下来看下面一个例子。
|
|
|
|
|
|
|
|
|
|
|
|
``` java
|
|
|
|
|
|
|
|
|
|
|
|
```
|
2016-05-18 01:15:50 +08:00
|
|
|
|
|
|
|
|
|
|
|
2016-05-17 22:26:58 +08:00
|
|
|
|
|
2016-05-17 02:42:44 +08:00
|
|
|
|
### 填充模式
|
2016-05-16 19:59:51 +08:00
|
|
|
|
|
2016-05-16 21:26:56 +08:00
|
|
|
|
跳票了两次终于讲到自相交图形问题了,在讲解之前我们先了解一下什么是自相交图形。
|
|
|
|
|
|
|
|
|
|
|
|
**自相交图形定义:**
|
|
|
|
|
|
|
|
|
|
|
|
> 多边形在平面内除了顶点之外还有其他公共点。
|
|
|
|
|
|
|
2016-05-17 02:42:44 +08:00
|
|
|
|
### 布尔操作(API19)
|
|
|
|
|
|
|
|
|
|
|
|
### 计算边界
|
|
|
|
|
|
|
|
|
|
|
|
### 重置路径
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-16 19:59:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|