代码之家  ›  专栏  ›  技术社区  ›  Uma Sankar

检查视图是否被其他视图(而不是窗口)完全隐藏

  •  0
  • Uma Sankar  · 技术社区  · 6 年前

    我有两个视图A和B。视图B是完全覆盖的视图A,这意味着视图B的边界矩形大于视图A的边界矩形。

    我能给出的最好的例子是,我有一个固定的底部选项卡布局和一个具有多个线性布局的回收视图。当我滚动时,其中一个线性布局将位于底部选项卡布局的后面。

    那么,如何通过编程检查视图A是否完整 被其他视图覆盖(其他视图可能不预先知道) ?

    有没有可能的方法来识别这个?

    更新: 我试过上面提到的解决方案 here .但它没有解决我的问题。在我的例子中,视图边界是完全匹配的,我想要哪个视图在顶部。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Alok Singh    6 年前

    使用以下方法可以帮助您查找视图重叠 -

    private boolean isYourViewOverlapping(View firstView, View secondView) {
            int[] firstPosition = new int[2];
            int[] secondPosition = new int[2];
    
            firstView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            firstView.getLocationOnScreen(firstPosition);
            secondView.getLocationOnScreen(secondPosition);
    
            int r = firstView.getMeasuredWidth() + firstPosition[0];
            int l = secondPosition[0];
            return r >= l && (r != 0 && l != 0);
        }
    
        2
  •  0
  •   Uma Sankar    6 年前

    经过大量的努力,我找到了一种方法来确定视图是否与其他视图重叠,方法如下。

    AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfo.obtain();
    viewA.onInitializeAccessibilityNodeInfo(nodeInfo);
    
    if (!nodeInfo.isVisibleToUser()) {
        // View is not visible to user. This also validates if viewA is overlapped by other views
    }
    
    nodeInfo.recycle();