У меня есть ScrollView
серия Views
. Я хотел бы иметь возможность определить, является ли представление в настоящее время видимым (если какая-либо его часть в настоящее время отображается с помощью ScrollView
). Я ожидаю, что приведенный ниже код сделает это, на удивление, это не так:
Rect bounds = new Rect();
view.getDrawingRect(bounds);
Rect scrollBounds = new Rect(scroll.getScrollX(), scroll.getScrollY(),
scroll.getScrollX() + scroll.getWidth(), scroll.getScrollY() + scroll.getHeight());
if(Rect.intersects(scrollBounds, bounds))
{
//is visible
}
android
scrollview
visible
AB11
источник
источник
Ответы:
Используйте
View#getHitRect
вместо того,View#getDrawingRect
чтобы тестировать. Вы можете использоватьView#getDrawingRect
наScrollView
вместо вычисления в явном виде.Код от
View#getDrawingRect
:Код от
View#getHitRect
:источник
Это работает:
источник
GridView
/ListView
/GridViewWithHeader
работать сSwipeRefreshLayout
.getHitRect
возвращает прямоугольник в родительских координатах, ноgetLocalVisibleRect
возвращает прямоугольник в локальных координатах прокрутки, не так ли?Если вы хотите обнаружить, что вид полностью видим:
источник
Мое решение - использовать
NestedScrollView
элемент прокрутки:источник
Чтобы немного расширить ответ Билла Мота с помощью getLocalVisibleRect, вы можете проверить, виден ли вид только частично:
источник
Это расширение поможет определить вид полностью видимым.
Это также работает, если вы
View
- ребенок от ... ofScrollView
(например:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Заметка
1)
view.getY()
иview.getX()
вернуть значение x, y первому родителю .2) Вот пример о том, как
getDrawingRect
вернется Ссылкаисточник
источник
Я столкнулся с той же проблемой сегодня. Пока я гуглял и читал справочник по Android, я нашел этот пост и метод, который я использовал вместо этого;
Приятно, что они предоставляют не только Rect, но и логическое указание, если View вообще виден. С отрицательной стороны этот метод недокументирован :(
источник
Если вы хотите определить
View
, полностью ли выvisible
, попробуйте этот метод:Строго говоря, вы можете получить видимость вида с:
Возможные постоянные значения видимости в представлении:
VISIBLE Этот вид виден. Используйте с setVisibility (int) и android: видимость.
НЕВИДИМОЕ Это представление невидимо, но оно все еще занимает место для макета. Используйте с setVisibility (int) и android: видимость.
GONE Этот вид невидим, и он не занимает места для макета. Используйте с setVisibility (int) и android: видимость.
источник
Вы можете использовать тот,
FocusAwareScrollView
который уведомляет, когда представление становится видимым:Вот класс:
источник
Котлин путь;
Расширение для отображения списка прокрутки прокрутки и получить действие, если дочерний вид виден на экране.
Используйте эту функцию расширения для любого прокручиваемого представления
источник
Я знаю, что очень поздно. Но у меня есть хорошее решение. Ниже приведен фрагмент кода для получения процента видимости в представлении прокрутки.
Прежде всего установите сенсорный слушатель в режиме прокрутки для получения обратного вызова для остановки прокрутки.
В приведенном выше фрагменте кода мы получаем обратные вызовы для событий касания просмотра прокрутки и публикуем работоспособность через 150 миллис (не обязательно) после получения обратного вызова для остановки прокрутки. В этом runnable мы получим расположение вида прокрутки на экране и высоту вида прокрутки. Затем получите прямой дочерний экземпляр группы просмотра представления прокрутки и получите количество дочерних элементов. В моем случае прямым потомком представления прокрутки является LinearLayout с именем scrollViewRootChild . Затем выполните итерации всех дочерних представлений scrollViewRootChild . В приведенном выше фрагменте кода вы можете видеть, как я получаю местоположение дочернего элемента на экране в массиве целых чисел с именем viewLocation , получаю высоту просмотра в имени переменной viewHeight . Затем я вызвал закрытый метод getViewVisibilityOnScrollStopped, Вы можете получить представление о внутренней работе этого метода, прочитав документацию.
Если вы чувствуете какие-либо улучшения в этом коде, пожалуйста, внесите свой вклад.
источник
В итоге я реализовал комбинацию из двух ответов Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 и @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) в мой проект в виде набора расширений Kotlin, которые поддерживают стандартные вертикальные элементы управления ScrollView или HorizontalScrollView.
Я просто бросил их в файл Kotlin с именем Extensions.kt, без класса, только методы.
Я использовал их, чтобы определить, к какому элементу привязываться, когда пользователь перестает прокручивать различные виды прокрутки в моем проекте:
Пример использования, итерация дочерних элементов scrollview LinearLayout и запись результатов:
источник
var
и подавляете ide подсказку?Используя ответ @Qberticus, который был кстати, но здорово, кстати, я собрал кучу кодов, чтобы проверить, если всякий раз, когда вызывается scrollview и прокручивается, он вызывает ответ @Qberticus, и вы можете делать все, что хотите, в моем случае у меня есть социальная сеть, содержащая видео, поэтому, когда изображение отображается на экране, я воспроизводю видео по той же идее, что и Facebook и Instagram. Вот код:
источник