Android: comment faire pour vérifier si une Vue à l'intérieur de la ScrollView est-elle visible?
J'ai un ScrollView
qui détient une série de Views
. Je voudrais être en mesure de déterminer si une vue est actuellement visible (si une partie est actuellement affichée par le ScrollView
). Je m'attends à ce que le code ci-dessous pour ce faire, étonnamment, il n'a pas:
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
}
- Je suis curieux de savoir comment vous avez obtenu ce travail. Je suis en train de faire la même chose mais d'une ScrollView ne peut accueillir 1 enfant direct. Sont votre "série de points de vue" enveloppé dans une autre mise en page à l'intérieur de la ScrollView? C'est la façon dont le mien, sont disposées mais lorsque je fais cela, aucune des réponses données ici, le travail pour moi.
- Oui, ma série de points de vue sont à l'intérieur d'un LinearLayout, qui est le 1er enfant de la ScrollView. Qberticus réponse a fonctionné pour moi.
Vous devez vous connecter pour publier un commentaire.
Utilisation
View#getHitRect
au lieu deView#getDrawingRect
sur la vue que vous effectuez le test. Vous pouvez utiliserView#getDrawingRect
sur leScrollView
au lieu de calculer explicitement.Code de
View#getDrawingRect
:Code de
View#getHitRect
:Cela fonctionne:
GridView
/ListView
/GridViewWithHeader
de travail avecSwipeRefreshLayout
.getHitRect
renvoie un rectangle dans les coordonnées du parent, maisgetLocalVisibleRect
renvoie un rectangle dans la scrollview coordonnées locales de l', n'est-ce pas?Si vous voulez détecter que la vue est ENTIÈREMENT visible:
D'étendre un peu sur le projet de Loi Mote de réponse à l'aide de getLocalVisibleRect, vous voudrez peut-être vérifier si la vue n'est que partiellement visible:
Ma Solution est d'utiliser
NestedScrollView
de Défilement de l'élément:J'ai connu le même problème aujourd'hui. Pendant Googler et de la lecture Android référence que j'ai trouvé ce post et une méthode que j'ai fini par utiliser à la place;
Gentil de leur part de ne pas seulement offrir Rect mais aussi booléen indiquant si la Vue visible à tous. Côté négatif, cette méthode est sans papiers 🙁
Je veux que vous pour détecter si votre
View
est entièrementvisible
, essayez cette méthode:À proprement parler, vous pouvez obtenir de la visibilité d'un point de vue avec:
Du possible, les valeurs des constantes de la visibilité en Vue sont:
VISIBLE
Ce point de vue est visible. Utilisation avec setVisibility(int) et android:la visibilité.
INVISIBLE
Ce point de vue est invisible, mais il faut encore de l'espace pour la disposition. Utilisation avec setVisibility(int) et android:la visibilité.
PARTI
Ce point de vue est invisible, et il ne prend pas tout l'espace de la disposition. Utilisation avec setVisibility(int) et android:la visibilité.
Vous pouvez utiliser le
FocusAwareScrollView
qui avertit lorsque la vue devient visible :Ici est de classe :
Cette extension aider à détecter vue entièrement visible.
Il fonctionne aussi si votre
View
est un enfant de enfant de ... deScrollView
(par exemple:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Note
1)
view.getY()
etview.getX()
retourner la valeur x,y à PREMIER PARENT.2) Voici l'exemple sur la façon
getDrawingRect
sera de retourLien
Je sais que je suis très en retard. Mais j'ai une bonne solution. Ci-dessous l'extrait de code pour l'obtention de vue de la visibilité pourcentage de défilement de la vue.
Tout d'abord définir le toucher d'écoute sur le défilement de la vue pour obtenir la fonction de rappel pour arrêter le défilement.
Dans l'extrait de code ci-dessus, nous obtenons des rappels pour faire défiler la vue des événements tactiles et après un praticable après 150 millis(Pas obligatoire) après l'obtention de la fonction de rappel pour faire défiler arrêté. Dans cet exécutable, nous allons obtenir la localisation de défilement de l'affichage sur l'écran et faites défiler la vue en hauteur. Puis obtenir l'enfant direct viewgroup instance de défilement de vue et d'obtenir l'enfant compte. Dans mon cas, directement à l'enfant de faire défiler la vue est LinearLayout nommé scrollViewRootChild. Parcourir toutes les vues enfant de scrollViewRootChild. Dans l'extrait de code ci-dessus vous pouvez voir que je suis l'obtention de l'emplacement de l'enfant sur l'écran dans un tableau d'entiers nommé viewLocation, obtenir la hauteur de vue dans le nom de la variable viewHeight. Ensuite, j'ai appelé une méthode privée getViewVisibilityOnScrollStopped. Vous pouvez obtenir la compréhension du fonctionnement interne de cette méthode par la lecture de la documentation.
Si vous vous sentez toute amélioration dans ce code merci de contribuer.
J'ai fini la mise en œuvre d'une combinaison de deux de la Java des réponses ( @bill-mote https://stackoverflow.com/a/12428154/3686125 et @denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) dans mon projet comme un ensemble de Kotlin extensions, qui prennent en charge standard vertial ScrollView ou HorizontalScrollView contrôles.
J'ai juste jeté dans une Kotlin fichier nommé Extensions.kt, pas de cours, juste des méthodes.
J'ai utilisé ces pour déterminer quel élément d'accrochage lorsque l'utilisateur cesse de défiler dans les différents scrollviews dans mon projet:
Exemple d'utilisation, une itération à travers le scrollview du LinearLayout enfants et la journalisation des sorties:
var
et la suppression de l'ide soupçon ?À l'aide de @Qberticus réponse qui était au point, mais le grand btw, je compined un tas de codes pour vérifier si chaque fois qu'un scrollview est appelé et a obtenu défile déclencher l' @Qberticus réponse 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é sur l'écran, je joue de la vidéo même idée comme facebook et Instagram.
Voici le code: