关于Region使用笔记

39 阅读2分钟

构造函数

public Region(Region region) // 复制一个Region的范围

public Region(Rect r) //创建一个矩形区域

public Region(int left,int top,int right,int bottom) //创建一个矩形区域

如果需要绘制创建的区域:(伪代码)

    Region region = new Region(new Rect(50,50,200,100));
    Regioniterator iter = new RegionIterator(region);
    Rect rect = new Rect()
    
    while(iter.next(rect)){
        canvas.drawRect(r,paint);
    }
    

间接构造

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表示一个区域A,clip表示一个区域B,那么最终的结果就是A∩B的部分

Path A = new Path();
Region B = new Region(10,10,10,10);
Region result = new Region();
result.setPath(A,B)
//result 就是A,B相交的部分,最终可通过上面绘制区域的方法呈现出来

此外还可以通过union()函数进行合并

    //伪代码    
    Region A = new Region()
    Rect B = new Rect()
    A.union(B)

区域操作

boolean op(Rect r,Op op)

boolean op(int left,int top,int right,int bottom,Op op)

boolean op(Region r,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 的区域 
}

借用一下《Android自定义控件开发入门与实战》中的图,其中A,B两个区域为横竖三个方框长度的长方形

image.png

开发中的思路:之前有在自定view的时候,比如类似圆角矩形进度调的时候,别人有些是使用贝塞尔绘制的,如果用区域求交,就可以去除复杂的求点绘制,控制两个求交的区域长度(比如下图的绿色放宽的长度)就好了。

image.png