Как узнать, виден ли вид на экране в Android?

Я хочу проверить, если View в пределах ScrollView в настоящее время виден в Android. Я не проверяю, сфокусировано ли оно на данный момент, но отображается ли оно в данный момент на экране. Есть ли метод в View что может сказать мне, если вид в настоящее время виден?

7 ответов

Этот код работает для меня:

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);
}
int[] location = new int[2];
view.getLocationOnScreen(location);

или же

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

Теперь используйте это местоположение или прямоугольник, чтобы проверить, находится ли он в ваших видимых границах или нет. Если это просто весь экран, проверьте getResources().getDisplayMetrics(),

Как указывает Antek в комментариях ниже, представление может все еще отсутствовать или быть невидимым с возвращенными значениями, указывающими, где оно было нарисовано в последний раз. Таким образом, объединяя вышеупомянутое связанное с границами условие с view.isShown() или же view.getVisibility() == VISIBLE должен позаботиться об этом.

Ответ zegee29 очень помогает. Хотя я бы хотел предложить использовать результат view.getGlobalVisibleRect(actualPosition) тоже, потому что в некоторых случаях 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)

Java-вариант сообщения user6029532 /questions/303557/kak-uznat-viden-li-vid-na-ekrane-v-android/58704619#58704619

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

Пытаться

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

getVisibility() Метод поможет вам проверить видимость любого View,

Пример:

if(view.getVisibility() == View.VISIBLE) {
    // Visible
} else { 
    // Invisible
}

Функция View.getVisibility() может иметь следующие значения:

  • View.VISIBLE (0): видимость видна.

  • View.INVISIBLE (1): представление невидимо, но все же занимает место для макета.

  • View.GONE (2): вид исчез. Полностью скрыт, как будто вид не был добавлен

Вы можете увидеть ссылку ниже для получения дополнительной информации. Как я могу проверить, является ли представление видимым или нет в Android?

Другие вопросы по тегам