概述
Region是绘制中的区域的意思。使用Region可以对图形有很多操作,比如区域的合并,取交集,取抑或等。
创建一个Region有如下的方法:
public Region()
public Region(Region region)
public Region(Rect r)
public Region(int left, int top, int right, int bottom)
除了第一个方法是构建一个空的区域以后,可以看到2,3,4个方法都是需要传值的,根据值创建一个指定区域,其中3,4方法都是构建一个矩形。
除了以上方法,region还可以后期指定它所代表的区域:
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)//将path和clip的两个区域取交集
其中set方法都是指定新的区域来代替Region对象原有的区域。
其实上诉操作以后,绘制图像的过程中,cavas中是没有直接绘制Region的方法的,要绘制指定的Region需要使用RegionIterator类来绘制,RegionIterator类看名字能看出来,是一个迭代器,它的作用主要是从指定的Region中获取rect,也就是矩形。
这里的思想是,任意指定Region的图形,都可以由若干个细分的矩形组成,从下面的图中可以看出这一点:
可以从上图看出,上图的圆形实际上是若干个矩形组成的,他们依次排列组成了圆形,因为这里画笔使用的style是stroke,所以看起来中间是空的,如果使用Fill风格,那么就会填充成实心圆形。
代码如下:
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(3);
Path path1 = new Path();
path1.addCircle(500, 500, 300, Path.Direction.CW);
Region region = new Region();
region.setPath(path1, new Region(0, 0, 1000, 1000));
//绘制
RegionIterator iterator = new RegionIterator(region);
Rect rect = new Rect();
while (iterator.next(rect)) {
canvas.drawRect(rect, mPaint);
}
可以看到,ReginIterator类,一次取出构成区域的大小不同的矩形,然后由cavas绘制,从而构成了不同的图形。
常用方法
1 SetPath()
boolean setPath (Path path, Region clip)
setPath方法在前面的示例中使用过,该方法的作用是将path区域和clip区域取交集,这里就不再单独作图。
2 区域操作
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)
区域的操作有很多种,以上方法第一个union主要是取并集,后面的op方法的含义是operation,操作的意思,那么进行何种操作,则由方法中的op参数来决定,Op是一个枚举类,取值如下
DIFFERENCE(0), //取补集
INTERSECT(1), // 交集
UNION(2), //并集
XOR(3), //异并集
REVERSE_DIFFERENCE(4), //反转补集
REPLACE(5); //后者区域替代前者
下面看效果图:次序按以上枚举次序
对应的代码如下
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1);
Path path1 = new Path();
Path path2 = new Path();
path1.addCircle(500, 500, 300, Path.Direction.CW);
path2.addCircle(500, 800, 300, Path.Direction.CW);
mPaint.setColor(Color.RED);
canvas.drawPath(path1,mPaint);
canvas.drawPath(path2,mPaint);
Region region = new Region();
Region region2 = new Region();
region.setPath(path1, new Region(0, 0, 1500, 1500));
region2.setPath(path2, new Region(0, 0, 1500, 1500));
region.op(region2, Region.Op.REPLACE);
//绘制
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
RegionIterator iterator = new RegionIterator(region);
Rect rect = new Rect();
while (iterator.next(rect)) {
canvas.drawRect(rect, mPaint);
}