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);
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值