矩形工具类:
关键函数:
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());