Я хочу проверить, отображается ли в настоящее время View
внутри ScrollView
в Android. Я не проверяю, сфокусирован ли он еще, но отображается ли он в данный момент на экране. Есть ли в View
метод, который может сказать мне, видимо ли представление в данный момент?
Как узнать, отображается ли представление на экране в Android?
Ответы (6)
Этот код работает для меня:
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);
}
Resources.getSystem().getDisplayMetrics().widthPixels
и Resources.getSystem().getDisplayMetrics().heightPixels
- person Bruno Bieri; 04.03.2020
int[] location = new int[2];
view.getLocationOnScreen(location);
or
Rect rect = new Rect();
view.getGlobalVisibleRect(rect);
Теперь используйте это местоположение или прямоугольник, чтобы проверить, находится ли он в ваших видимых границах или нет. Если это просто весь экран, сверьтесь с getResources().getDisplayMetrics()
.
Как указал Antek в комментариях ниже, представление может по-прежнему исчезать или быть невидимым, а возвращаемые здесь значения сообщают, где оно было нарисовано в последний раз. Таким образом, сочетание приведенного выше условия, связанного с границами, с view.isShown()
или view.getVisibility() == VISIBLE
должно позаботиться об этом.
visibility = GONE
(я только что переключил его, у него было visibility = VISIBLE
), но видимый прямоугольник остается таким, каким он был при создании представления. Проверять не надо, так как я сам поставил в одном месте в коде.
- person Antek; 18.07.2017
0,0
в любом случае (группа полноэкранного просмотра)
- person Antek; 18.07.2017
location
они имели в виду левый верхний угол вида (который может иметь некоторые размеры) - поэтому любой вид, расположенный там, независимо от размера, будет иметь такое расположение.
- person Antek; 19.07.2017
boundingBox
?
- person Antek; 25.07.2017
Ответ 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)
пытаться
if(view.isShown()) {
// Visible
} else {
// Invisible
}
View
, поэтому ненадежный и не правильный ответ.
- person r3flss ExlUtr; 05.12.2016
общественное логическое значение checkVisiblity (представление вида) {
если (view.isShown()) вернуть истину; иначе вернуть ложь;
}
Функция View.getVisibility() может иметь следующие значения:
View.VISIBLE (0): вид виден.
View.INVISIBLE (1): представление невидимо, но оно по-прежнему занимает место для макета.
View.GONE (2): представление исчезло. Полностью скрыт, как будто вид не добавлялся
Вы можете увидеть ссылку ниже для получения дополнительной информации. Как можно Я проверяю, отображается ли представление в Android?