Region区域

画出Region:

功能说明:由于Canvas中并没有用来画Region的方法,说明Region的本意并不是用来绘图的。
所以如果我们想将Region画出来,就必须自己想办法,这里定义的drawRegion()函数为自定义函数,方便的将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区域:

关键函数:

Region

构造函数:

public Region() 
public Region(Region region)
public Region(Rect r) 
public Region(int left, int top, int right, int bottom) 

参数:

region:                              复制一个Region的范围
r:                                      创建一个矩形区域
left,top,right,bottom:        创建一个矩形区域
无参数:                            间接构造传递

示例:

1.直接构造:

Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
Region region = new Region(new Rect(50, 50, 200, 100));
drawRegion(canvas, region, paint);

如图:

2.间接构造:

void setEmpty()
boolean set(Region region)
boolean set(Rect r)
boolean set(int left, int top, int right, int bottom)
boolean setPath(Path path, Region clip)

参数:

setEmpty:                             将原来的一个区域变量变成空变量
region:                                  利用新的区域替换原来的区域
r:                                           利用矩形所代表的区域替换原来的区域
left,top,right,bottom:             根据矩形的两个角点构造出矩形区域来替换原来的区域
path,clip:                               根据路径的区域与某区域的交集构造出新的区域

主要讲解setPath函数,其它没什么难理解的

构造函数:

boolean setPath(Path path, Region clip)

参数:

path:                        用来构造区域的路径
clip:                          与前面的path所构成的路径取交集,把重叠的部分设为最终区域

示例:

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);
//构造一个Region区域
Region rgn = new Region();
//在指定路径的指定区域取交集,并把重叠部分设置为最终区域
rgn.setPath(ovalPath, new Region(50, 50, 200, 200));
//画出路径
drawRegion(canvas, rgn, paint);

如图:

图一是指定路径,图二是指定区域,把重叠的区域设置为新区域

枚举区域——RegionIterator:

功能说明:

一个区域是由多个矩形来表示的,RegionIterator类就实现了获取组成区域的矩形集
它包含两个函数,一个构造函数和获取下一个矩形的函数

1.构造函数:

RegionIterator RegionIterator(Region region)

参数:

region:                                   根据对应的区域返回对应的矩形集

2.获取下一个矩形:

boolean next(Rect r)

参数:

r:                                           传进去一个Rect类的参数,可以是新实例化的,获取到的矩形将保存到传进去的Rect里

示例:

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

区域相交:

1.union()函数

功能说明:把指定的矩形添加到当前区域中

构造函数:

boolean union(Rect r)

参数:

r:                            将Rect所指定的矩形加入当前区域中

示例:

Paint paint =new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
//先声明一个区域
Region region =new Region (30,30,200,100);
//把指定的矩形加入当前区域中
region.union(new Rect(30,30,50,300));
drawRegion(canvas,region,paint);

如图:

图一是声明的区域,图二是指定矩形,图三是合并后的样子

区域操作:

系列方法一:

功能说明:用当前的Region对象与指定的Rect或者Region执行op操作,并将结果赋给当前的Region对象,如果成功,则返回true,否则返回false

构造函数:

boolean op(Rect r, Op op)
boolean op(int left, int top, int right, int bottom, Op op)
boolean op(Region region, Op op)

参数:

r:                                                    矩形Rect类
op:                                                 指定操作类型,参数值有如下6个:
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的区域 
}
left,top,right,bottom:                      左上右下
region:                                            region区域

取相交的例子:

//构造两个矩形
Rect rect1 = new Rect(100, 100, 400, 200);
Rect rect2 = new Rect(200, 0, 300, 300);
//构造一个画笔,画出矩形的轮廓
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 = new Region(rect1);
Region region2 = new Region(rect2);
//取两个区域的交集
region.op(region2, Region.Op.INTERSECT);
//构造一个填充画笔,将region区域用红色填充
Paint paint_fill = new Paint();
paint_fill.setColor(Color.RED);
paint_fill.setStyle(Paint.Style.FILL);
drawRegion(canvas, region, paint_fill);

如图:

其它op枚举值与此类似,不同值如下所示:

 

系列方法二:

功能说明:这两个函数与方法一不同的是,这两个函数允许我们传入两个Region对象进行操作

构造函数:

boolean op(Rect r, Region region, Op op)
boolean op(Region region1, Region2 region2, Op op)

参数:

r:                                                    矩形Rect类
op:                                                 指定操作类型,参数值有如下6个:
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的区域 
}
region1/2:                                      region区域

函数用法示例:

//构造region1区域1
Region region1 = new Region(100, 100, 400, 200);
//构造region1区域2
Region region2 = new Region(200, 10, 300, 300);
Region region = new Region();
//取相交,并把结果返回给region
region.op(region1, region2, Region.Op.INTERSECT);
//构造一个填充画笔,将返回的结果区域用红色描边
Paint paint_fill = new Paint();
paint_fill.setColor(Color.RED);
paint_fill.setStyle(Paint.Style.STROKE);
drawRegion(canvas, region, paint_fill);

如图:

图一是region1,图二是region2,图三是取它们相交的区域

Region的其它函数:

1.判断方法

public boolean isEmpty();                                         用于判断该区域是否为空
public boolean isRect();                                            用于判断该区域是否是一个矩阵
public boolean isComplex();                                     用于判断该区域是否是多个矩阵的组合

2.getBound系列函数

public Rect getBounds();                                          返回能够包裹当前路径的最小矩形           
public boolean getBounds(Rect r);                           参数r返回能够包裹当前路径的最小矩形
public Path getBoundaryPath();                               返回当前矩形所对应的Path对象
public boolean getBoundaryPath(Path path);          参数path返回当前矩形所对应的Path对象

3.是否包含

public boolean contains(int x, int y);                                                   判断该区域是否包含某个点
public boolean quickContains(Rect r);                                               判断该区域是否包含某个矩形
public boolean quickContains(int left,int top, int right, int bottom);     判断该区域是否对应的左上右下

4.是否相交

public boolean quickReject(Rect r);                                                    判断该区域是否没有和指定矩形相交
public boolean quickReject(int left,int top, int right, int bottom);          判断该区域是否没有和指定左上右下相交    
public boolean quickReject(Region rgn);                                            判断是否没有和指定区域相交

5.平移变换

public void translate(int dx, int dy); 
该函数用于将Region对象向X轴平移dx距离,向Y轴平移dy距离,并将结果赋给当前Region对象,X轴向右是正方向,Y轴向下是正方向


public void translate(int dx, int dy, Region dst);
与上一个函数不同的是,该函数将结果赋给dst对象,而当前Region对象的值保持不变

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值