构造Region
构造Region有4个构造函数
public Region() //创建一个空的区域
public Region(Region region) //拷贝一个region的范围
public Region(Rect r) //创建一个矩形的区域
public Region(int left, int top, int right, int bottom) //创建一个矩形的区域
第一个需要和其他函数配合使用;第二个表示根据其他的Region复制一个Region;第三个和第四个是最常用的,根据矩形或者左上和右下两个点创造的矩形区域。
2.简介构造
public void setEmpty() //置空
public boolean set(Region region)
public boolean set(Rect r)
public boolean set(int left, int top, int right, int bottom)
public boolean setPath(Path path, Region clip)//后面单独讲
Region提供了一系列的set方法,含义如下:
SetEmpty():从某种意义上讲置空也是一个构造函数,即将原来的一个区域变量变成了一个空变量,要再利用其它的Set方法重新构造区域。
set(Region region):利用新的区域值来替换原来的区域
set(Rect r):利用矩形所代表的区域替换原来的区域
set(int left, int top, int right, int bottom):同样,根据矩形的两个点构造出矩形区域来替换原来的区域值
setPath(Path path, Region clip):根据路径的区域与某区域的交集,构造出新区域
3.使用setPath构造不规则的区域
boolean setPath(Path path,Region clip)
path为构造区域的路径;clip与path与构造的路径的交集构成区域。
下面是一个简单的demo,先构造一个椭圆路径,然后在SetPath时,传进去一个比Path小的矩形区域,让它们两个取交集
Path path=new Path();
RectF rectF=new RectF(50,400,250,800);
path.addOval(rectF, Path.Direction.CW);
Region region=new Region();
region.setPath(path,new Region(50,400,250,600));
RegionIterator iter = new RegionIterator(region);
Rect r = new Rect();
while (iter.next(r)) {
canvas.drawRect(r, paint);
}
区域矩形集枚举—RegionIterator类
RegionIterator类,实现了获取组成区域的矩形集的功能,其实RegionIterator类非常简单,总共就两个函数,一个构造函数和一个获取下一个矩形的函数;
RegionIterator(Region region) //根据区域构建对应的矩形集
boolean next(Rect r) //获取下一个矩形,结果保存在参数Rect r 中
如果将上述例子中的paint的style改为stroke的话,可能会看的更加清楚。
paint.setStyle(Paint.Style.STROKE);
Path path2=new Path();
RectF rectF2=new RectF(300,400,500,800);
path2.addOval(rectF2, Path.Direction.CW);
Region region2=new Region();
region2.setPath(path2,new Region(300,400,500,600));
RegionIterator iter2= new RegionIterator(region2);
Rect r2= new Rect();
while (iter2.next(r2)) {
canvas.drawRect(r2, paint);
}
区域的合并与交叉操作
无论是区域还是矩形,都会涉及到对另一个区域的一些操作,比如交集、并集等。
public final boolean union(Rect r)
public boolean op(Rect r, Op op) {
public boolean op(int left, int top, int right, int bottom, Op op)
public boolean op(Region region, Op op)
public boolean op(Rect rect, Region region, Op op)
第一个函数是指定区交集操作;其余的op函数,都是需要指定与另外的区域的操作,这里最重要的就是知道Op的参数
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的区域
}
先通过取交集的例子来感受一下:
Rect rect=new Rect(400,400,800,600);
Rect rect2=new Rect(500,300,700,700);
canvas.drawRect(rect,paint);
canvas.drawRect(rect2,paint);
Region region1=new Region(rect);
Region region2=new Region(rect2);
region1.op(region2, Region.Op.INTERSECT);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.GREEN);
RegionIterator iterator=new RegionIterator(region1);
Rect r=new Rect();
while(iterator.next(r))
{
canvas.drawRect(r,paint);
}
下面是Op的六种操作的对比:
其它的方法
/**几个判断方法*/
public native boolean isEmpty();//判断该区域是否为空
public native boolean isRect(); //是否是一个矩阵
public native boolean isComplex();//是否是多个矩阵组合
/**一系列的getBound方法,返回一个Region的边界*/
public Rect getBounds()
public boolean getBounds(Rect r)
public Path getBoundaryPath()
public boolean getBoundaryPath(Path path)
/**一系列的判断是否包含某点 和是否相交*/
public native boolean contains(int x, int y);//是否包含某点
public boolean quickContains(Rect r) //是否包含某矩形
public native boolean quickContains(int left, int top, int right,
int bottom) //是否没有包含某矩阵形
public boolean quickReject(Rect r) //是否没和该矩形相交
public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交
public native boolean quickReject(Region rgn); //是否没和该矩形相交
/**几个平移变换的方法*/
public void translate(int dx, int dy)
public native void translate(int dx, int dy, Region dst);
public void scale(float scale) //hide
public native void scale(float scale, Region dst);//hide