Rect、RecrF 矩形类

矩形工具类:

关键函数:

RectF、Rect

这两个参数都是矩形工具类,根据4个点构造出一个矩形结构,RectF与Rect中的方法、成员变量完全一样,唯一不同的是RectF参数是float类型的,而Rect参数是int类型的 

构造函数:

RectF:

RecfF()
RectF(float left,float top,float right,float bottom)
RecfF(RecfF rectF)
RecfF(Recf rect)

参数:

(left,top,right,bottom):                                 分别对应左上右下,坐标为:StartX,StartY,EndX,EndY;
rectF:                                                            可传入RectF
rect:                                                              可传入Rect

Rect:

Rect()
Rect(int left,int top,int right,int bottom)        
Rect(Recf rect)

参数:

(left,top,right,bottom):                                 分别对应左上右下,坐标为:StartX,StartY,EndX,EndY;
rect:                                                              可传入Rect


判断是否包含某个点:

构造函数:

Rect.contains(int x,int y);   

参数:  

x,y:                  当前要判断的坐标
return:             返回boolean类型 

该函数用于判断某个点是否在当前矩形中,如果在,则返回true,如果不在,则返回false(int X,int Y)就是当前要判断的坐标;

示例:

rect.contains(mX, mY)        //比如触摸屏幕返回的x,y坐标

判断是否包含某个矩形:

构造函数:

Boolean contains(int left,int top,int right,int bottom)
Boolean conntains(Rect r)

参数:

(left,top,right,bottom):                根据矩形的4个点或者一个Rect矩形对象来判断这个矩形是否在当前的矩形区域内;
r:                                                Rect

示例:

rect.contains(int left,int top,int right,int bottom);
rect.contains(Rect r);

判断两个矩形是否相交:

1) 静态方法判断是否相交:

static boolean intersects(Rect a,Rect b)

这是Rect类的一个静态方法,用来判断参数中所传入的两个Rect矩形是否相交,如果相交则返回true,否则返回false;

示例:

        Rect rect_one = new Rect(10, 10, 200, 200);
        Rect rect_two = new Rect(190, 10, 250, 200);
        Rect rect_three = new Rect(10, 210, 200, 300);

        //分别画出三个矩形
        paint.setColor(Color.RED);
        canvas.drawRect(rect_one,paint);
        paint.setColor(Color.GREEN);
        canvas.drawRect(rect_two,paint);
        paint.setColor(Color.YELLOW);
        canvas.drawRect(rect_three,paint);
        //判断是否相交,1跟2的矩形区域有相交,1跟3的矩形区域无相交,因为1和2的上与下相交了
        Boolean intersetOne_Two = Rect.intersects(rect_one ,rect_two );
        Boolean intersetOne_Three = Rect.intersects(rect_one ,rect_three );
        Log.d("intersects","rect_one&rect_two:"+intersetOne_Two+"  rect_one&rect_three:"+intersetOne_Three);

2) 成员方法判断是否相交:

boolean intersects(int left,int top,int right,int bottom)
boolean intersect(int left,int top,int right,int bottom)
boolean intersect(Rect r)

还可以使用Rect类中自带的方法来判断当前Rect对象与其它矩形是否相交;
intersect方法与intersects方法的区别是,不仅会返回是否相交的结果(intersect)而且会把相交部分的坐标赋给当前调用者对象,如果两个矩形不相交,则当前调用者对象保持不变;
intersects函数只是判断是否相交,并不会改变原矩形的值,当然静态原则也是一样;

使用方法:

        Rect rect_1 = new Rect(10, 10, 200, 200);
        Boolean result_1 = rect_1.intersects(190, 10, 250, 200);
        Boolean result_2 = rect_1.intersect(210, 10, 250, 200);
        Boolean result_3 = rect_1.intersect(190, 10, 250, 190);

打印:

[10,10][200,200]  result:true
[10,10][200,200]  result:false
[190,10][200,190]  result:true

第三个是否相交坐标里,从左到右,只要相交,就会替换调用者的值
result_3第一个左边开始的190和rect_1右边的200(200范围以内)相交,所以rect_1第一个值被更改为190,10不相交,200不相交,190底部由于在rect_1底部200范围以内,所以相交,也被更改为190;

合并:

构造函数:

public void union(int left,int top,int right,int bottom)
public void union(Rect r)

1) 合并两个矩形:

合并两个矩形的意思就是将两个矩形合并成一个矩形,既无论这两个矩形是否相交,分别取两个矩形最小左边和上边为左上角点,取两个矩形最大的右边和下边作为结果矩形的右下角点,如果要合并的两个矩形有一方为空,则将有值的一方作为最终结果,合并的结果将会被赋值给当前调用者对象;

示例:

        Rect rect_1 = new Rect(10, 60, 80, 300);
        Rect rect_2 = new Rect(70, 10, 100, 110);
        //分别画出原矩形rect_1
        paint.setColor(Color.RED);
        canvas.drawRect(rect_1, paint);
        //分别画出原矩形rect_2
        paint.setColor(Color.GREEN);
        canvas.drawRect(rect_2, paint);
        //画出合并之后结果的颜色
        paint.setColor(Color.YELLOW);
        //把2合并到1
        rect_1.union(rect_2);
        //重画1
        canvas.drawRect(rect_1, paint);

效果图:

打印日志:

未合并前rect_1:[10,60][80,300]
未合并前rect_2:[70,10][100,110]
合并后的rect_1:[10,10][100,300]
合并后的rect_2:[70,10][100,110]

由于左上分别都是10小,右下分别是100,300大,所以最终的合并结果为:[10,10][100,300]

上图红色是合并前的1,绿色是合并前的2,黄色是合并后的1,由于没有重绘刷新,方便大家理解,所以旧的1还是存在;

2) 合并矩形与某个点:

构造函数:

public void union(int x,int y)

x,y首先和leftX,leftY对比,哪一个小,取哪一个的值,之后x,y和rightX,rightY进行对比,哪一个大,取哪一个的值,如果x大,但是x已经在第一次对比赋过值了,那么不会再对rightX进行赋值,y也是同理一样
最后,x,y肯定会替换left,top,right,bottom 其中之二的值,无论是否相交

示例:

        Rect rect_1 = new Rect(100, 9, 5, 1);
        rect_1.union(11, 300);
        rect_1 = new Rect(300,300,10,10);
        rect_1.union(100, 100);

打印日志:

[11,9][5,300]                    //调用rect_1.union(11, 300)的打印 
[100,100][10,10]             //调用rect_1.union(100, 100)的打印

打印坐标区域:

Rect.toShortString()

示例:

Rect result = new Rect(10, 60, 80, 300);
Log.d("outPrint", rect.toShortString());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值