天天看點

Region區域

概述

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的圖形,都可以由若幹個細分的矩形組成,從下面的圖中可以看出這一點:

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); //後者區域替代前者    
           

下面看效果圖:次序按以上枚舉次序

Region區域
Region區域
Region區域
Region區域
Region區域
Region區域

對應的代碼如下

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);
}