android Region 類介紹

1、簡介

Region意思是區域,範圍.先了解有啥api給我們使用,然後每個api啥意思,我們就可以根據這個做出我們想要的效果出來,自定義view學習一般是這樣的吧,至少個人是這麼認爲的.

2、構造函數

public Region() {
    this(nativeConstructor());
}

/** Return a copy of the specified region
*/
public Region(Region region) {
    this(nativeConstructor());
    nativeSetRegion(mNativeRegion, region.mNativeRegion);
}

/** Return a region set to the specified rectangle
*/
public Region(Rect r) {
    mNativeRegion = nativeConstructor();
    nativeSetRect(mNativeRegion, r.left, r.top, r.right, r.bottom);
}

/** Return a region set to the specified rectangle
*/
public Region(int left, int top, int right, int bottom) {
    mNativeRegion = nativeConstructor();
    nativeSetRect(mNativeRegion, left, top, right, bottom);
}

我們發現有四個構造函數,先每個函數試試什麼意思,

package com.simple;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.RegionIterator;
import android.util.AttributeSet;
import android.view.View;
/**
 * Created by admin on 2017/7/11.
 */
public class RegionView extends View {
    private Paint mPaint;
    public RegionView(Context context) {
        this(context,null);
    }
    public RegionView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public RegionView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();  //初始化 畫筆
    }
    private void initPaint() {
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
        mPaint.setStrokeWidth(3);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Region region = new Region(); //創建一個 Region  對象
        drawRegion(canvas,region,mPaint); //自定義方法 繪製 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對象,如圖:
在這裏插入圖片描述

用崔健的一首歌來形容是一無所有啊,對,沒錯,確實是什麼都沒有,因爲空的構造函數是沒指定區域的,哪它就相當於是(0,0)座標位置了.

現在構造函數改變一下:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Region region = new Region(0,0,100,100); //創建一個 有區域參數的 Region  對象
    drawRegion(canvas,region,mPaint);
}
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 對象來賦值傳遞

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Region region1 = new Region(0,0,100,100); //創建一個 region  對象
    Region region = new Region(region1); //用已有對象 創建另一個
    drawRegion(canvas,region,mPaint);
}
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);
    }
}

2、常用方法

1) setEmpty()

就是把之前的區域給置空

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Region region = new Region(0,0,100,100);
    //region.setEmpty();  //打開函數 將什麼也看不到
    drawRegion(canvas,regi on,mPaint);
}
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);
    }
}
2)set()

用新的區域覆蓋原來的區域

例子:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Region region = new Region(0,0,100,100);
    region.setEmpty();
    Region region1 = new Region(0,0,100,100);
    region.set(region1);
    drawRegion(canvas,region,mPaint);
}
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設置了一個矩形,然後又置爲空了,然後又給它設置了一個矩形,相當於是在原來空的區域地方設置了一個矩形。
圖:
在這裏插入圖片描述

public boolean set(Rect r)把原來的區域用矩形來代替

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Region region = new Region(0,0,100,100);
    region.setEmpty();
    region.set(new Rect(100,100,400,400)); //傳遞 矩形對象
    drawRegion(canvas,region,mPaint);
}
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);
    }
}

這是先給了一個矩形(0,0),(100,100)然後設置爲空了,再然後給他設置了一個矩形(100,100),(400,400).
圖:
在這裏插入圖片描述

這個方法public boolean set(int left, int top, int right, int bottom)和上面的是同一個意思.不多講

3) isEmpty()

判斷區域是否是空的

4) isRect()

判斷這個區域是否是矩形

5) isComplex()

判斷這個區域是否是 多個矩形構建而成

6) contains()

判斷一個點是否在某個區域內
public native boolean contains(int x, int y) 判斷這個點是否在這區域內

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    region = new Region(0,0,100,100);
    region.setEmpty();
    region.set(new Rect(100,100,400,400));
    mPaint.setColor(Color.GREEN);
    region.translate(0,50,region);
    drawRegion(canvas,region,mPaint);
}
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
public boolean onTouchEvent(MotionEvent event) {
    int downX = (int)event.getX();
    int downY = (int)event.getY();
    boolean isContain =  region.contains(downX,downY);
    if(isContain){
        Toast.makeText(getContext(),"這個點在這個區域內",Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(getContext(),"這個點不在這個區域內",Toast.LENGTH_LONG).show();
    }
    return true;
}

效果圖:

在這裏插入圖片描述

7) getBounds()

返回的是 區域的矩形位置

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    region = new Region(0,0,100,100);
    drawRegion(canvas,region,mPaint);
    Rect rect =  region.getBounds();
    Log.e(TAG,"left="+rect.left);
    Log.e(TAG,"top="+rect.top);
    Log.e(TAG,"right="+rect.right);
    Log.e(TAG,"bottom="+rect.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);
    }
}
log:
07-11 03:47:13.188 6873-6873/com.simple E/RegionView: left=0
07-11 03:47:13.188 6873-6873/com.simple E/RegionView: top=0
07-11 03:47:13.188 6873-6873/com.simple E/RegionView: right=100
07-11 03:47:13.188 6873-6873/com.simple E/RegionView: bottom=100

getBounds(Rect r) 是把Region區域賦值給這個r,

 @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    region = new Region(0,0,10,10);
    Rect rect = new Rect(200,200,240,240);
    drawRegion(canvas,region,mPaint);
    boolean  a=  region.getBounds(rect);
    Log.e(TAG,"a="+a);
    Log.e(TAG, ""+rect);

}

log:
07-11 04:11:55.014 30301-30301/com.simple E/RegionView: a=true
07-11 04:11:55.014 30301-30301/com.simple E/RegionView: Rect(0, 0 - 10, 10)

從log發現rect原來是(200,200),(240,240)現在變成了(0,0),(10,10),倒推就是region的區域賦值給了rect,相等於rect = region.getRect(),

8)quickContains()

quickContains(Rect r)這個方法是判斷r這個矩形是否在區域內


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
region = new Region(0,0,100,100);
Rect rect = new Rect(0,0,101,101);
drawRegion(canvas,region,mPaint);
boolean b = region.quickContains(rect);
Log.e(TAG,“b=”+b);
rect = new Rect(0,0,100,100);
boolean c = region.quickContains(rect);
Log.e(TAG,“c=”+c);
}


log:
07-11 05:10:07.150 19374-19374/com.simple E/RegionView: b=false
07-11 05:10:07.150 19374-19374/com.simple E/RegionView: c=true

9)op()

public boolean op(Rect r, Op op)

第一個參數是Rect

第二個參數是op

查看源代碼:

public enum Op {
    DIFFERENCE(0),
    INTERSECT(1),
    UNION(2),
    XOR(3),
    REVERSE_DIFFERENCE(4),
    REPLACE(5);

    Op(int nativeInt) {
        this.nativeInt = nativeInt;
    }

    /**
     * @hide
     */
    public final int nativeInt;
}
寫例子去證明每個啥意思:


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Rect rect1 = new Rect(200,200,500,500);
    Rect rect2 = new Rect(300,300,600,600);
    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 region1 = new Region(rect1);
    Region region2= new Region(rect2);
    **region1**.op(region2, Region.Op.DIFFERENCE);  //設置兩個 區域操作爲 DIFFERENCE
    paint.setColor(Color.GREEN);
    paint.setStyle(Paint.Style.FILL);
    drawRegion(canvas, **region1**, paint);
}
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);
    }
}

DIFFERENCE
DIFFERENCE就是region1-(region1和region2的交集) 補集
在這裏插入圖片描述

INTERSECT
INTERSECT就是region1和region2的交集
在這裏插入圖片描述

UNION
UNION就是region1和region2的並集
在這裏插入圖片描述

XOR
XOR就是region1和region2的並集並減去region1和region2的交集 異並集
在這裏插入圖片描述

REVERSE_DIFFERENCE
REVERSE_DIFFERENCE就是region2減去region2和region1的交集 反轉補集
在這裏插入圖片描述

REPLACE
REPLACE:就是顯示region2的區域 替換
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章