画出Region:
功能说明:由于Canvas中并没有用来画Region的方法,说明Region的本意并不是用来绘图的。
所以如果我们想将Region画出来,就必须自己想办法,这里定义的drawRegion()函数为自定义函数,方便的将Region画出来,只是为了方便讲解示例而使用
private void drawRegion(Canvas canvas, Region rgn, Paint paint) {
RegionIterator iter = new RegionIterator(rgn);
Rect r = new Rect();
while (iter.next(r)) {
canvas.drawRect(r, paint);
}
}
Region区域:
关键函数:
Region
构造函数:
public Region()
public Region(Region region)
public Region(Rect r)
public Region(int left, int top, int right, int bottom)
参数:
region: 复制一个Region的范围
r: 创建一个矩形区域
left,top,right,bottom: 创建一个矩形区域
无参数: 间接构造传递
示例:
1.直接构造:
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
Region region = new Region(new Rect(50, 50, 200, 100));
drawRegion(canvas, region, paint);
如图:
2.间接构造:
void setEmpty()
boolean set(Region region)
boolean set(Rect r)
boolean set(int left, int top, int right, int bottom)
boolean setPath(Path path, Region clip)
参数:
setEmpty: 将原来的一个区域变量变成空变量
region: 利用新的区域替换原来的区域
r: 利用矩形所代表的区域替换原来的区域
left,top,right,bottom: 根据矩形的两个角点构造出矩形区域来替换原来的区域
path,clip: 根据路径的区域与某区域的交集构造出新的区域
主要讲解setPath函数,其它没什么难理解的
构造函数:
boolean setPath(Path path, Region clip)
参数:
path: 用来构造区域的路径
clip: 与前面的path所构成的路径取交集,把重叠的部分设为最终区域
示例:
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
//构造一个路径
Path ovalPath = new Path();
//构造一个矩形区域
RectF rect = new RectF(50, 50, 200, 500);
//在这个矩形区域里画个圆
ovalPath.addOval(rect, Path.Direction.CCW);
//构造一个Region区域
Region rgn = new Region();
//在指定路径的指定区域取交集,并把重叠部分设置为最终区域
rgn.setPath(ovalPath, new Region(50, 50, 200, 200));
//画出路径
drawRegion(canvas, rgn, paint);
如图:
图一是指定路径,图二是指定区域,把重叠的区域设置为新区域
枚举区域——RegionIterator:
功能说明:
一个区域是由多个矩形来表示的,RegionIterator类就实现了获取组成区域的矩形集
它包含两个函数,一个构造函数和获取下一个矩形的函数
1.构造函数:
RegionIterator RegionIterator(Region region)
参数:
region: 根据对应的区域返回对应的矩形集
2.获取下一个矩形:
boolean next(Rect r)
参数:
r: 传进去一个Rect类的参数,可以是新实例化的,获取到的矩形将保存到传进去的Rect里
示例:
private void drawRegion(Canvas canvas, Region rgn, Paint paint) {
RegionIterator iter = new RegionIterator(rgn);
Rect r = new Rect();
while (iter.next(r)) {
canvas.drawRect(r, paint);
}
}
区域相交:
1.union()函数
功能说明:把指定的矩形添加到当前区域中
构造函数:
boolean union(Rect r)
参数:
r: 将Rect所指定的矩形加入当前区域中
示例:
Paint paint =new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
//先声明一个区域
Region region =new Region (30,30,200,100);
//把指定的矩形加入当前区域中
region.union(new Rect(30,30,50,300));
drawRegion(canvas,region,paint);
如图:
图一是声明的区域,图二是指定矩形,图三是合并后的样子
区域操作:
系列方法一:
功能说明:用当前的Region对象与指定的Rect或者Region执行op操作,并将结果赋给当前的Region对象,如果成功,则返回true,否则返回false
构造函数:
boolean op(Rect r, Op op)
boolean op(int left, int top, int right, int bottom, Op op)
boolean op(Region region, Op op)
参数:
r: 矩形Rect类
op: 指定操作类型,参数值有如下6个:
public enum Op{
DIFFERENCE(0), 最终区域为region1与region2不同的区域
INTERSECT(1), 最终区域为region1与region2相交的区域
UNION(2), 最终区域为region1与region2组合在一起的区域
XOR(3), 最终区域为region1与region2相交之外的区域
REVERSE_DIFFERENCE(4), 最终区域为region2与region1不同的区域
REPLACE(5); 最终区域为region2的区域
}
left,top,right,bottom: 左上右下
region: region区域
取相交的例子:
//构造两个矩形
Rect rect1 = new Rect(100, 100, 400, 200);
Rect rect2 = new Rect(200, 0, 300, 300);
//构造一个画笔,画出矩形的轮廓
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
canvas.drawRect(rect1, paint);
canvas.drawRect(rect2, paint);
//构造两个区域
Region region = new Region(rect1);
Region region2 = new Region(rect2);
//取两个区域的交集
region.op(region2, Region.Op.INTERSECT);
//构造一个填充画笔,将region区域用红色填充
Paint paint_fill = new Paint();
paint_fill.setColor(Color.RED);
paint_fill.setStyle(Paint.Style.FILL);
drawRegion(canvas, region, paint_fill);
如图:
其它op枚举值与此类似,不同值如下所示:
系列方法二:
功能说明:这两个函数与方法一不同的是,这两个函数允许我们传入两个Region对象进行操作
构造函数:
boolean op(Rect r, Region region, Op op)
boolean op(Region region1, Region2 region2, Op op)
参数:
r: 矩形Rect类
op: 指定操作类型,参数值有如下6个:
public enum Op{
DIFFERENCE(0), 最终区域为region1与region2不同的区域
INTERSECT(1), 最终区域为region1与region2相交的区域
UNION(2), 最终区域为region1与region2组合在一起的区域
XOR(3), 最终区域为region1与region2相交之外的区域
REVERSE_DIFFERENCE(4), 最终区域为region2与region1不同的区域
REPLACE(5); 最终区域为region2的区域
}
region1/2: region区域
函数用法示例:
//构造region1区域1
Region region1 = new Region(100, 100, 400, 200);
//构造region1区域2
Region region2 = new Region(200, 10, 300, 300);
Region region = new Region();
//取相交,并把结果返回给region
region.op(region1, region2, Region.Op.INTERSECT);
//构造一个填充画笔,将返回的结果区域用红色描边
Paint paint_fill = new Paint();
paint_fill.setColor(Color.RED);
paint_fill.setStyle(Paint.Style.STROKE);
drawRegion(canvas, region, paint_fill);
如图:
图一是region1,图二是region2,图三是取它们相交的区域
Region的其它函数:
1.判断方法
public boolean isEmpty(); 用于判断该区域是否为空
public boolean isRect(); 用于判断该区域是否是一个矩阵
public boolean isComplex(); 用于判断该区域是否是多个矩阵的组合
2.getBound系列函数
public Rect getBounds(); 返回能够包裹当前路径的最小矩形
public boolean getBounds(Rect r); 参数r返回能够包裹当前路径的最小矩形
public Path getBoundaryPath(); 返回当前矩形所对应的Path对象
public boolean getBoundaryPath(Path path); 参数path返回当前矩形所对应的Path对象
3.是否包含
public boolean contains(int x, int y); 判断该区域是否包含某个点
public boolean quickContains(Rect r); 判断该区域是否包含某个矩形
public boolean quickContains(int left,int top, int right, int bottom); 判断该区域是否对应的左上右下
4.是否相交
public boolean quickReject(Rect r); 判断该区域是否没有和指定矩形相交
public boolean quickReject(int left,int top, int right, int bottom); 判断该区域是否没有和指定左上右下相交
public boolean quickReject(Region rgn); 判断是否没有和指定区域相交
5.平移变换
public void translate(int dx, int dy);
该函数用于将Region对象向X轴平移dx距离,向Y轴平移dy距离,并将结果赋给当前Region对象,X轴向右是正方向,Y轴向下是正方向
public void translate(int dx, int dy, Region dst);
与上一个函数不同的是,该函数将结果赋给dst对象,而当前Region对象的值保持不变