1. 程式人生 > >自定義控件之Region區域

自定義控件之Region區域

fill paint 最小 row ima n) nali 對象 通過

構造Region

直接構造

    public Region(Region region)  //復制一個同樣的Region變量
    public Region(Rect r) 
    public Region(int left, int top, int right, int bottom)

示例:

   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); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); Region region
= new Region(new Rect(50, 50, 200, 100)); drawRegion(canvas, region, paint); }

間接構造

public Region()

set函數:

    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)//根據路徑的區域與某區域的交集構造出新的區域

置空

  public void setEmpty() //將原來的區域設置為空,再利用其它set函數重新構造區域

註意調用set系列函數的region是不是有區域值,當調用set系列函數後,原來的區域值就會替換成set系列函數裏的區域值

示例:

        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);
        //SetPath時,傳入一個比橢圓區域小的矩形區域,讓其取交集
        Region rgn = new Region();
        rgn.setPath(ovalPath, new Region(50, 50, 200, 200));
        //畫出路徑
        drawRegion(canvas, rgn, paint);

枚舉區域-RegionIterator 類

    public RegionIterator(Region region) 構造函數
    public final boolean next(Rect r)獲取下一個矩形
    protected void finalize() throws Throwable 

在Canvas中沒有直接繪制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);
        }
    }

區域相交

boolean nuion(Rect r)函數用於與指定的矩形取並集

區域操作

    public boolean op(Rect r, Region.Op op)
    public boolean op(int left, int top, int right, int bottom, Region.Op op) 
    public boolean op(Region region, Region.Op op)
    public boolean op(Rect rect, Region region, Region.Op op)
    public boolean op(Region region1, Region region2, Region.Op op) 

Op參數值如下

DIFFERENCE  最終區域為region1和region2不同的區域
INTERSECT  最終區域為region1和region2相交區域
REPLACE  最終區域為region2的區域
REVERSE_DIFFERENCE  最終區域為region2和region1不同的區域
UNION  最終區域為region1和region2組合一起的區域
XOR  最終區域為region1和region2相交之外的區域

示例代碼:

 private void init() {

        //構造兩個矩形
        rect1 = new Rect(100,100,400,200);
        rect2 = new Rect(200,0,300,300);

        //構造一個畫筆,畫出矩形輪廓
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);


        //構造兩個Region
        region = new Region(rect1);
        region2= new Region(rect2);

        //取兩個區域的交集
        region.op(region2, Region.Op. REVERSE_DIFFERENCE);
    }


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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //畫出相交的矩形
        canvas.drawRect(rect1, paint);
        canvas.drawRect(rect2, paint);

        //畫面相交的結果
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.FILL);
        drawRegion(canvas, region, paint);
    }

改變Op參數對比

技術分享圖片

DIFFERENCE

技術分享圖片

INTERSECT

技術分享圖片

REPLACE

技術分享圖片

REVERSE_DIFFERENCE

技術分享圖片

UNION

技術分享圖片

XOR

其他函數

判斷方法:

 boolean isEmpty();  判斷該區域是否為空
 boolean isRect();判斷該區域是否是一個矩陣
 boolean isComplex();判斷該區域是否是多個矩陣的組合

getBound系列函數

用於返回一個Region邊界,用於返回能夠包裹當前路徑的最小矩形

 public Rect getBounds()
 public boolean getBounds(Rect r)

用於返回當前矩形所對應的Path對象

 public Path getBoundaryPath()
 public boolean getBoundaryPath(Path path) 

是否包含

public native boolean contains(int var1, int var2);
public boolean quickContains(Rect r) 
public native boolean quickContains(int var1, int var2, int var3, int var4);

是否相交

 public boolean quickReject(Rect r)
     public native boolean quickReject(int var1, int var2, int var3, int var4);
    public native boolean quickReject(Region var1);

平移變換

public void translate(int dx, int dy) 
public native void translate(int var1, int var2, Region var3);

自定義控件之Region區域