如何判断视图是否在Android屏幕上可见?

dkqlctbz  于 2023-02-27  发布在  Android
关注(0)|答案(7)|浏览(273)

我想检查ScrollView中的View当前是否在Android中可见。我不检查它是否处于焦点状态,而是检查它当前是否显示在屏幕上。View中是否有方法可以告诉我视图当前是否可见?

b1zrtrql

b1zrtrql1#

这个代码对我有效:

public static boolean isVisible(final View view) {
    if (view == null) {
        return false;
    }
    if (!view.isShown()) {
        return false;
    }
    final Rect actualPosition = new Rect();
    view.getGlobalVisibleRect(actualPosition);
    final Rect screen = new Rect(0, 0, getScreenWidth(), getScreenHeight());
    return actualPosition.intersect(screen);
}
unhi4e5o

unhi4e5o2#

int[] location = new int[2];
view.getLocationOnScreen(location);

Rect rect = new Rect();
view.getGlobalVisibleRect(rect);

现在使用这个位置或矩形来检查它是否在你的可见边界内。如果它只是整个屏幕,检查getResources().getDisplayMetrics()
正如Antek在下面的注解中指出的那样,视图可能仍然消失或不可见,这里的返回值告诉我们它最后一次绘制的位置。因此,将上述与边界相关的条件与view.isShown()view.getVisibility() == VISIBLE结合起来应该可以解决这个问题。

z5btuh9x

z5btuh9x3#

zegee29's的答案很有帮助。虽然我想建议也使用view.getGlobalVisibleRect(actualPosition)的结果,因为在某些情况下,当item根本不可见时,Rect.intersects()返回true,所以结果代码为:

fun View.isVisible(): Boolean {
    if (!isShown) {
        return false
    }
    val actualPosition = Rect()
    val isGlobalVisible = getGlobalVisibleRect(actualPosition)
    val screenWidth = Resources.getSystem().displayMetrics.widthPixels
    val screenHeight = Resources.getSystem().displayMetrics.heightPixels
    val screen = Rect(0, 0, screenWidth, screenHeight)
    return isGlobalVisible && Rect.intersects(actualPosition, screen)
}

或者你可能只是getGlobalVisibleRect(actualPosition)的结果

7uhlpewt

7uhlpewt4#

https://stackoverflow.com/a/66907184/2323972之后Диана Ганиева的Java变体

boolean isViewOnScreen(View target)
{
       if (!target.isShown())
        {
            return false;
        }
        final var actualPosition = new Rect();
        final var isGlobalVisible = target.getGlobalVisibleRect(actualPosition);
        final var screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
        final var screenHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
        final var screen = new Rect(0, 0, screenWidth, screenHeight);
        return isGlobalVisible && Rect.intersects(actualPosition, screen);
}
utugiqy6

utugiqy65#

尝试

if(view.isShown()) {
    // Visible
} else { 
    // Invisible
}
0s0u357o

0s0u357o6#

公共布尔checkVisibility(查看视图){
如果(view.isShown())返回真;否则返回false;
}

n3h0vuf2

n3h0vuf27#

函数View.getVisibility()可以具有以下值:

  • 查看。可见(0):视图是可见的。
  • 视图。不可见(1):视图是不可见的,但出于布局目的,它仍会占用空间。
  • 查看。消失(2):视图已消失。完全隐藏,就像未添加视图一样

你可以看到下面的链接了解更多信息。我如何检查视图是否在Android中可见?

相关问题