Mam, ScrollView
który zawiera serię Views
. Chciałbym móc określić, czy widok jest aktualnie widoczny (czy jakakolwiek jego część jest obecnie wyświetlana przez ScrollView
). Spodziewałbym się, że poniższy kod to zrobi, o dziwo nie:
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
źródło
źródło
Odpowiedzi:
Użyj
View#getHitRect
zamiastView#getDrawingRect
w widoku, który testujesz. Możesz użyćView#getDrawingRect
naScrollView
zamiast obliczania jawnie.Kod od
View#getDrawingRect
:Kod od
View#getHitRect
:źródło
To działa:
źródło
GridView
/ListView
/GridViewWithHeader
pracy zSwipeRefreshLayout
.getHitRect
zwraca prostokąt we współrzędnych nadrzędnych, alegetLocalVisibleRect
zwraca prostokąt we współrzędnych lokalnych widoku przewijania, prawda?Jeśli chcesz wykryć, że widok jest W PEŁNI widoczny:
źródło
Moje rozwiązanie to użyj
NestedScrollView
elementu przewijania:źródło
Aby nieco rozwinąć odpowiedź Billa Mote'a za pomocą getLocalVisibleRect, możesz sprawdzić, czy widok jest widoczny tylko częściowo:
źródło
To rozszerzenie pomaga wykryć widok w pełni widoczny.
Działa również, jeśli jesteś
View
dzieckiem dziecka ...ScrollView
(np .:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Uwaga
1)
view.getY()
iview.getX()
zwróć wartość x, y do FIRST PARENT .2) Oto przykład, w jaki sposób
getDrawingRect
zwróci linkźródło
źródło
Dzisiaj miałem ten sam problem. Podczas wyszukiwania w Google i czytania odniesień do Androida znalazłem ten post i metodę, której zamiast tego użyłem;
Fajnie z nich, że nie tylko zapewniają Rect, ale także boolean wskazujący, czy View w ogóle jest widoczny. Z drugiej strony ta metoda jest nieudokumentowana :(
źródło
Chcesz sprawdzić, czy Twój
View
jest w pełnivisible
, spróbuj tą metodą:Ściśle mówiąc, możesz uzyskać widoczność widoku za pomocą:
Możliwe stałe wartości widoczności w Widoku to:
VISIBLE Ten widok jest widoczny. Używaj z setVisibility (int) i android: visibility.
INVISIBLE Ten widok jest niewidoczny, ale nadal zajmuje miejsce do celów układu. Używaj z setVisibility (int) i android: visibility.
GONE Ten widok jest niewidoczny i nie zajmuje miejsca do celów układu. Używaj z setVisibility (int) i android: visibility.
źródło
Możesz użyć,
FocusAwareScrollView
które powiadamia, gdy widok staje się widoczny:Oto klasa:
źródło
Sposób Kotlina;
Rozszerzenie do wyświetlania przewijania widoku listy i wykonywania akcji, jeśli widok podrzędny jest widoczny na ekranie.
Użyj tej funkcji rozszerzenia dla dowolnego przewijalnego widoku
źródło
Wiem, że jest bardzo późno. Ale mam dobre rozwiązanie. Poniżej znajduje się fragment kodu do uzyskiwania procentowej widoczności widoku w widoku przewijania.
Przede wszystkim ustaw odbiornik dotykowy w widoku przewijania, aby uzyskać oddzwonienie do zatrzymania przewijania.
W powyższym fragmencie kodu otrzymujemy wywołania zwrotne dla zdarzeń dotykowych widoku przewijania i publikujemy plik uruchamialny po 150 milisekundach (nieobowiązkowe) po zatrzymaniu wywołania zwrotnego przewijania. W tym runnable uzyskamy lokalizację widoku przewijania na ekranie i wysokość widoku przewijania. Następnie pobierz bezpośrednią instancję podrzędnej grupy widoków widoku przewijania i uzyskaj liczbę podrzędnych. W moim przypadku bezpośredniego dziecko widzenia przewijania jest LinearLayout nazwie scrollViewRootChild . Następnie wykonaj iterację wszystkich widoków podrzędnych scrollViewRootChild . W powyższym fragmencie kodu widać, że pobieram lokalizację dziecka na ekranie w tablicy liczb całkowitych o nazwie viewLocation , uzyskam wysokość widoku w zmiennej nazwa viewHeight . Następnie wywołałem metodę prywatną getViewVisibilityOnScrollStopped. Możesz zrozumieć wewnętrzne działanie tej metody, czytając dokumentację.
Jeśli czujesz jakąkolwiek poprawę w tym kodzie, prosimy o wkład.
źródło
Skończyło się na zaimplementowaniu kombinacji dwóch odpowiedzi Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 i @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) w mój projekt jako zestaw rozszerzeń Kotlin, które obsługują standardowe kontrolki ScrollView w pionie lub HorizontalScrollView.
Właśnie wrzuciłem je do pliku Kotlin o nazwie Extensions.kt, bez klasy, tylko metody.
Użyłem ich do określenia, do którego elementu należy przyciągnąć, gdy użytkownik przestanie przewijać w różnych widokach przewijania w moim projekcie:
Przykładowe użycie, iteracja przez elementy potomne LinearLayout scrollview i wyniki logowania:
źródło
var
i tłumisz podpowiedź ide?Korzystając z odpowiedzi @Qberticus, która była do rzeczy, ale przy okazji świetnie, skompilowałem kilka kodów, aby sprawdzić, czy za każdym razem, gdy wywoływany jest widok scrollview i jest przewijany, wywołuje odpowiedź @Qberticus i możesz robić, co chcesz, w moim przypadku mam sieć społecznościowa zawierająca filmy, więc kiedy widok jest rysowany na ekranie, odtwarzam ten sam pomysł, co Facebook i Instagram. Oto kod:
źródło