Android自定义View——Path操作学习笔记

Posted by Csming on 2017-03-05

Path简介

Path封装了直线曲线构成的几何路径;
可以利用Canvas的drawPath绘制;也可以用于剪裁画布,根据路径绘制文字;也可以用于描述一个图像的轮廓;

有开放和封闭路径的区别;

Paht常用方法

  • **移动起点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:**矩阵变换

使用方法

moveTo、 setLastPoint、 lineTo 和 close

1
2
3
4
5
6
7
8
// moveTo只改变下次操作的起点
public void moveTo (float x, float y)
// setLastPoint设置之前操作的最后一个点位置
public void setLastPoint (float dx, float dy)

public void lineTo (float x, float y)
//用于连接当前最后一个点和最初的一个点
public void close ()

addXxx与arcTo

  • addXxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 第一类(基本形状)

// 圆形
public void addCircle (float x, float y, float radius, Path.Direction dir)
// 椭圆
public void addOval (RectF oval, Path.Direction dir)
// 矩形
public void addRect (float left, float top, float right, float bottom, Path.Direction dir)
public void addRect (RectF rect, Path.Direction dir)
// 圆角矩形
public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)

// path 组合path
public void addPath (Path src)
public void addPath (Path src, float dx, float dy)
public void addPath (Path src, Matrix matrix)

// addArc直接添加一个圆弧到path中
public void addArc (RectF oval, float startAngle, float sweepAngle)
// arcTo添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
public void arcTo (RectF oval, float startAngle, float sweepAngle)
public void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

## isEmpty、 isRect、isConvex、 set 和 offset
```java
public boolean isEmpty ()
public boolean isRect (RectF rect)

//将新的path赋值到现有path。
public void set (Path src)

//对path进行一段平移,它和Canvas中的translate作用很像,但Canvas作用于整个画布,而path的offset只作用于当前path
public void offset (float dx, float dy)
public void offset (float dx, float dy, Path dst)

rXxx方法

rXxx方法的坐标使用的是相对位置(基于当前点的位移),而之前方法的坐标是绝对位置(基于当前坐标系的坐标)

填充模式

Paint有三种样式,“描边” “填充” 以及 “描边加填充”
给一个图形内部填充颜色,首先需要分清哪一部分是外部,哪一部分是内部

Android的填充模式封装在Path中

EVEN_ODD 奇偶规则
INVERSE_EVEN_ODD 反奇偶规则
WINDING 非零环绕数规则
INVERSE_WINDING 反非零环绕数规则

  • **Path关于填充模式的方法

setFillType 设置填充规则
getFillType 获取当前填充规则
isInverseFillType 判断是否是反向(INVERSE)规则
toggleInverseFillType 切换填充规则(即原有规则与反向规则之间相互切换)

Bool操作

DIFFERENCE 差集
REVERSE_DIFFERENCE 差集 与DIFFERENCE相反
INTERSECT 交集
UNION 并集
XOR 异或

  • Path中的布尔运算方法

boolean op (Path path, Path.Op op)

boolean op (Path path1, Path path2, Path.Op op)

1
2
3
4
5
// 对 path1 和 path2 执行布尔运算,运算方式由第二个参数指定,运算结果存入到path1中。
path1.op(path2, Path.Op.DIFFERENCE);

// 对 path1 和 path2 执行布尔运算,运算方式由第三个参数指定,运算结果存入到path3中。
path3.op(path1, path2, Path.Op.DIFFERENCE)

计算边界

Path中的方法

void computeBounds(RectF bounds,boolean exact)
bounds 测量结果会放入这个矩形
exact 是否精确测量;一般为true

重置路径

reset


出处:http://www.gcssloop.com/customview/Path_Basic
http://www.gcssloop.com/customview/Path_Over