Canvas---区域(Range)

构造Region

构造Region有4个构造函数

 public Region()  //创建一个空的区域  
 public Region(Region region) //拷贝一个region的范围  
 public Region(Rect r)  //创建一个矩形的区域  
 public Region(int left, int top, int right, int bottom) //创建一个矩形的区域 

第一个需要和其他函数配合使用;第二个表示根据其他的Region复制一个Region;第三个和第四个是最常用的,根据矩形或者左上和右下两个点创造的矩形区域。

2.简介构造

 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)//后面单独讲

Region提供了一系列的set方法,含义如下:
SetEmpty():从某种意义上讲置空也是一个构造函数,即将原来的一个区域变量变成了一个空变量,要再利用其它的Set方法重新构造区域。
set(Region region):利用新的区域值来替换原来的区域
set(Rect r):利用矩形所代表的区域替换原来的区域
set(int left, int top, int right, int bottom):同样,根据矩形的两个点构造出矩形区域来替换原来的区域值
setPath(Path path, Region clip):根据路径的区域与某区域的交集,构造出新区域

3.使用setPath构造不规则的区域

boolean setPath(Path path,Region clip)

path为构造区域的路径;clip与path与构造的路径的交集构成区域。

下面是一个简单的demo,先构造一个椭圆路径,然后在SetPath时,传进去一个比Path小的矩形区域,让它们两个取交集

 Path path=new Path();
        RectF rectF=new RectF(50,400,250,800);
        path.addOval(rectF, Path.Direction.CW);

        Region region=new Region();

        region.setPath(path,new Region(50,400,250,600));

        RegionIterator iter = new RegionIterator(region);
        Rect r = new Rect();

        while (iter.next(r)) {
            canvas.drawRect(r, paint);
        }

区域矩形集枚举—RegionIterator类

RegionIterator类,实现了获取组成区域的矩形集的功能,其实RegionIterator类非常简单,总共就两个函数,一个构造函数和一个获取下一个矩形的函数;
RegionIterator(Region region) //根据区域构建对应的矩形集
boolean next(Rect r) //获取下一个矩形,结果保存在参数Rect r 中

如果将上述例子中的paint的style改为stroke的话,可能会看的更加清楚。

 paint.setStyle(Paint.Style.STROKE);
        Path path2=new Path();
        RectF rectF2=new RectF(300,400,500,800);
        path2.addOval(rectF2, Path.Direction.CW);

        Region region2=new Region();

        region2.setPath(path2,new Region(300,400,500,600));

        RegionIterator iter2= new RegionIterator(region2);
        Rect r2= new Rect();

        while (iter2.next(r2)) {
            canvas.drawRect(r2, paint);
        }

区域的合并与交叉操作

无论是区域还是矩形,都会涉及到对另一个区域的一些操作,比如交集、并集等。

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)  

第一个函数是指定区交集操作;其余的op函数,都是需要指定与另外的区域的操作,这里最重要的就是知道Op的参数

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的区域    
 }   

先通过取交集的例子来感受一下:

 Rect rect=new Rect(400,400,800,600);
        Rect rect2=new Rect(500,300,700,700);
        canvas.drawRect(rect,paint);
        canvas.drawRect(rect2,paint);

        Region region1=new Region(rect);
        Region region2=new Region(rect2);

        region1.op(region2, Region.Op.INTERSECT);

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.GREEN);
        RegionIterator iterator=new RegionIterator(region1);
        Rect r=new Rect();
        while(iterator.next(r))
        {
            canvas.drawRect(r,paint);
        }

下面是Op的六种操作的对比:
这里写图片描述

其它的方法


/**几个判断方法*/    
public native boolean isEmpty();//判断该区域是否为空    
public native boolean isRect(); //是否是一个矩阵    
public native boolean isComplex();//是否是多个矩阵组合    


/**一系列的getBound方法,返回一个Region的边界*/    
public Rect getBounds()     
public boolean getBounds(Rect r)     
public Path getBoundaryPath()     
public boolean getBoundaryPath(Path path)     


/**一系列的判断是否包含某点 和是否相交*/    
public native boolean contains(int x, int y);//是否包含某点    
public boolean quickContains(Rect r)   //是否包含某矩形  
public native boolean quickContains(int left, int top, int right,    
                                        int bottom) //是否没有包含某矩阵形   
 public boolean quickReject(Rect r) //是否没和该矩形相交    
 public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交    
 public native boolean quickReject(Region rgn);  //是否没和该矩形相交    

/**几个平移变换的方法*/    
public void translate(int dx, int dy)     
public native void translate(int dx, int dy, Region dst);    
public void scale(float scale) //hide    
public native void scale(float scale, Region dst);//hide  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值