Как узнать, виден ли вид на экране в 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?