How can you tell if a View is visible on screen in Android?

AndroidAndroid ViewAndroid ScrollviewVisible

Android Problem Overview


I want to check if a View within a ScrollView is currently visible in Android. I am not checking if it is focused on yet but if it is currently being displayed on screen. Is there a method in View that can tell me if the view is currently visible?

Android Solutions


Solution 1 - Android

This code works for me:

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);
}

Solution 2 - Android

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

or

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

Now use this location or rectangle to check if it is in your visible bounds or not. If it is simply the entire screen, check against getResources().getDisplayMetrics().

As pointed by Antek in the comments below, the view may still be gone or invisible with the returned values here telling where it was last drawn. So combining the above bounds-related condition with an view.isShown() or view.getVisibility() == VISIBLE should take care of that.

Solution 3 - Android

zegee29's answer is quite helping. Although I'd like to suggest using the result of view.getGlobalVisibleRect(actualPosition) too, because in some cases Rect.intersects() returns true when item is not visible at all, so the resulting code is:

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)
}

Or you may just the result of getGlobalVisibleRect(actualPosition)

Solution 4 - Android

try

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

Solution 5 - Android

public boolean checkVisiblity(View view){

if(view.isShown()) return true; else return false;

}

Solution 6 - Android

The function View.getVisibility() can have below values:

  • View.VISIBLE (0): the view is visible.

  • View.INVISIBLE (1): The view is invisible, but it still takes up space for layout purposes.

  • View.GONE (2): the view is gone. Completely hidden, as if the view had not been added

You can see below link for more info. https://stackoverflow.com/questions/3791607/how-can-i-check-if-a-view-is-visible-or-not-in-android/3791698#3791698

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1847544View Question on Stackoverflow
Solution 1 - Androidzegee29View Answer on Stackoverflow
Solution 2 - AndroidAA_PVView Answer on Stackoverflow
Solution 3 - AndroidДиана ГанееваView Answer on Stackoverflow
Solution 4 - AndroidRohit SutharView Answer on Stackoverflow
Solution 5 - AndroidJaydev BharadwajView Answer on Stackoverflow
Solution 6 - AndroidsecretlmView Answer on Stackoverflow