J'ai un ScrollView
qui détient une série de Views
. Je voudrais pouvoir déterminer si une vue est actuellement visible (si une partie de celle-ci est actuellement affichée par le ScrollView
). Je m'attendrais à ce que le code ci-dessous fasse cela, étonnamment ce n'est pas le cas:
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
}
Réponses:
Utilisez
View#getHitRect
plutôt queView#getDrawingRect
sur la vue que vous testez. Vous pouvez utiliserView#getDrawingRect
sur auScrollView
lieu de calculer explicitement.Code de
View#getDrawingRect
:Code de
View#getHitRect
:la source
Cela marche:
la source
GridView
/ListView
/GridViewWithHeader
travailler avecSwipeRefreshLayout
.getHitRect
renvoie un rect dans les coordonnées parent, maisgetLocalVisibleRect
renvoie un rect dans les coordonnées locales de la vue de défilement, n'est-ce pas?Si vous voulez détecter que la vue est ENTIÈREMENT visible:
la source
Ma solution est d'utiliser l'
NestedScrollView
élément Scroll:la source
Pour développer un peu la réponse de Bill Mote à l'aide de getLocalVisibleRect, vous voudrez peut-être vérifier si la vue n'est que partiellement visible:
la source
Cette extension aide à détecter la vue entièrement visible.
Cela fonctionne également si vous
View
êtes un enfant de ... deScrollView
(par exemple:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Remarque
1)
view.getY()
etview.getX()
renvoyer la valeur x, y à FIRST PARENT .2) Voici un exemple sur la façon dont
getDrawingRect
le lien retournerala source
la source
J'ai fait face au même problème aujourd'hui. En cherchant sur Google et en lisant la référence Android, j'ai trouvé cet article et une méthode que j'ai fini par utiliser à la place;
Bien de leur part non seulement de fournir Rect mais aussi de booléen indiquant si View est visible du tout. Du côté négatif, cette méthode n'est pas documentée :(
la source
Si vous voulez détecter si vous êtes
View
pleinementvisible
, essayez avec cette méthode:À proprement parler, vous pouvez obtenir la visibilité d'une vue avec:
Les valeurs constantes possibles de la visibilité dans une vue sont:
VISIBLE Cette vue est visible. À utiliser avec setVisibility (int) et android: visibilité.
INVISIBLE Cette vue est invisible, mais elle occupe toujours de l'espace à des fins de mise en page. À utiliser avec setVisibility (int) et android: visibilité.
DISPARU Cette vue est invisible et ne prend pas de place pour la mise en page. À utiliser avec setVisibility (int) et android: visibilité.
la source
Vous pouvez utiliser le
FocusAwareScrollView
qui avertit lorsque la vue devient visible:Voici la classe:
la source
Façon Kotlin;
Une extension pour lister le défilement de la vue de défilement et obtenir une action si la vue enfant est visible à l'écran.
Utilisez cette fonction d'extension pour toute vue déroulante
la source
Je sais que c'est très tard. Mais j'ai une bonne solution. Vous trouverez ci-dessous l'extrait de code permettant d'obtenir le pourcentage de visibilité de la vue en mode défilement.
Tout d'abord, réglez l'écouteur tactile sur la vue de défilement pour obtenir un rappel pour l'arrêt du défilement.
Dans l'extrait de code ci-dessus, nous recevons des rappels pour les événements tactiles de la vue de défilement et publions un exécutable après 150 millisecondes (non obligatoire) après avoir arrêté le rappel pour le défilement. Dans ce runnable, nous obtiendrons l'emplacement de la vue de défilement sur l'écran et la hauteur de la vue de défilement. Ensuite, obtenez l'instance de groupe de vues enfant direct de la vue de défilement et obtenez le nombre d'enfants. Dans mon cas, l'enfant direct de la vue de défilement est LinearLayout nommé scrollViewRootChild . Ensuite, itérez toutes les vues enfants de scrollViewRootChild . Dans l'extrait de code ci-dessus, vous pouvez voir que j'obtiens l'emplacement de l'enfant à l'écran dans un tableau d'entiers nommé viewLocation , obtenez la hauteur de vue dans le nom de la variable viewHeight . Ensuite, j'ai appelé une méthode privée getViewVisibilityOnScrollStopped. Vous pouvez comprendre le fonctionnement interne de cette méthode en lisant la documentation.
Si vous ressentez une amélioration de ce code, veuillez contribuer.
la source
J'ai fini par implémenter une combinaison de deux des réponses Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 et @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) dans mon projet sous la forme d'un ensemble d'extensions Kotlin, qui prennent en charge les contrôles ScrollView vertical standard ou HorizontalScrollView.
Je viens de les jeter dans un fichier Kotlin nommé Extensions.kt, pas de classe, juste des méthodes.
Je les ai utilisés pour déterminer sur quel élément effectuer un accrochage lorsqu'un utilisateur arrête de défiler dans diverses vues de défilement de mon projet:
Exemple d'utilisation, itération dans les enfants LinearLayout de scrollview et journalisation des sorties:
la source
var
et supprimez l'indication ide?En utilisant la réponse @Qberticus qui était au point mais super btw, j'ai compilé un tas de codes pour vérifier si chaque fois qu'un scrollview est appelé et fait défiler, il déclenche la réponse @Qberticus et vous pouvez faire ce que vous voulez, dans mon cas, j'ai un réseau social contenant des vidéos, donc lorsque la vue est dessinée sur l'écran, je joue la vidéo de la même idée que Facebook et Instagram. Voici le code:
la source