You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

比较两个Android Rect相对位置的更优雅实现方法

优化实现方案

你原来的逻辑是对的:判断Rect B位于Rect A右侧需要同时满足两个条件:

  1. 两个矩形在垂直方向存在重叠
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:06:06