比较两个Android Rect相对位置的更优雅实现方法
优化实现方案
你原来的逻辑是对的:判断Rect B位于Rect A右侧需要同时满足两个条件:
- 两个矩形在垂直方向存在重叠
- B的左边界大于等于A的右边界
可以通过简化重叠判断、去掉冗余的if包装来让代码更优雅:
最简优化版
直接用标准区间重叠判断替换两次between调用,同时直接返回布尔表达式,不需要额外的if分支:
private boolean isAtRight(Rect rectA, Rect rectB) { // 垂直方向重叠判断等价于你原来的两个between或条件 boolean verticalOverlap = rectB.top < rectA.bottom && rectB.bottom > rectA.top; return verticalOverlap && rectB.left >= rectA.right; }
如果可以接受代码更短,也可以合并为一行:
private boolean isAtRight(Rect rectA, Rect rectB) { return rectB.left >= rectA.right && rectB.top < rectA.bottom && rectB.bottom > rectA.top; }
可扩展版本
如果还要实现上方、左侧、下方等其他方位判断,可以抽取出公共的重叠判断方法,整体逻辑更清晰,复用性更高:
// 检查两个矩形垂直方向是否重叠 private boolean isVerticalOverlap(Rect a, Rect b) { return b.top < a.bottom && b.bottom > a.top; } // 检查两个矩形水平方向是否重叠 private boolean isHorizontalOverlap(Rect a, Rect b) { return b.left < a.right && b.right > a.left; } // B位于A右侧 private boolean isAtRight(Rect a, Rect b) { return isVerticalOverlap(a, b) && b.left >= a.right; } // B位于A左侧 private boolean isAtLeft(Rect a, Rect b) { return isVerticalOverlap(a, b) && b.right <= a.left; } // B位于A上方 private boolean isAtTop(Rect a, Rect b) { return isHorizontalOverlap(a, b) && b.bottom <= a.top; } // B位于A下方 private boolean isAtBottom(Rect a, Rect b) { return isHorizontalOverlap(a, b) && b.top >= a.bottom; }
内容的提问来源于stack exchange,提问作者LaoDa581
相关产品推荐
相关产品推荐

