Ich habe eine ScrollView
, die eine Reihe von hält Views
. Ich möchte feststellen können, ob eine Ansicht derzeit sichtbar ist (wenn ein Teil davon derzeit von der angezeigt wird ScrollView
). Ich würde erwarten, dass der folgende Code dies tut, überraschenderweise nicht:
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
quelle
quelle
Antworten:
Verwenden Sie
View#getHitRect
anstelleView#getDrawingRect
der Ansicht, die Sie testen. Sie könnenView#getDrawingRect
auf dieScrollView
anstatt explizit berechnen.Code von
View#getDrawingRect
:Code von
View#getHitRect
:quelle
Das funktioniert:
quelle
GridView
/ListView
/GridViewWithHeader
Arbeit mitSwipeRefreshLayout
.getHitRect
in den übergeordneten Koordinaten zurück, abergetLocalVisibleRect
ein Rechteck in den lokalen Koordinaten der Bildlaufansicht, nicht wahr?Wenn Sie feststellen möchten, dass die Ansicht VOLLSTÄNDIG sichtbar ist:
quelle
Meine Lösung ist das
NestedScrollView
Scroll-Element:quelle
Um die Antwort von Bill Mote mit getLocalVisibleRect ein wenig zu erweitern, möchten Sie möglicherweise überprüfen, ob die Ansicht nur teilweise sichtbar ist:
quelle
Diese Erweiterung hilft dabei, die Ansicht vollständig sichtbar zu erkennen.
Es funktioniert auch, wenn Sie
View
ein Kind von Kind von ... von sindScrollView
(zB:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Hinweis
1)
view.getY()
undview.getX()
geben Sie den x, y-Wert an FIRST PARENT zurück .2) Hier ist beispielsweise darüber , wie
getDrawingRect
kehrt Verbindungquelle
quelle
Ich hatte heute das gleiche Problem. Beim Googeln und Lesen der Android-Referenz habe ich diesen Beitrag und eine Methode gefunden, die ich stattdessen verwendet habe.
Schön, dass sie nicht nur Rect, sondern auch Boolesche Werte bereitstellen, um anzuzeigen, ob View überhaupt sichtbar ist. Auf der negativen Seite ist diese Methode nicht dokumentiert :(
quelle
Wenn Sie feststellen möchten, ob Ihr
View
System vollständig istvisible
, versuchen Sie es mit folgender Methode:Genau genommen können Sie die Sichtbarkeit einer Ansicht erhalten mit:
Die möglichen konstanten Werte der Sichtbarkeit in einer Ansicht sind:
SICHTBAR Diese Ansicht ist sichtbar. Verwendung mit setVisibility (int) und android: sichtbarkeit.
UNSICHTBAR Diese Ansicht ist unsichtbar, nimmt jedoch Platz für Layoutzwecke ein . Verwendung mit setVisibility (int) und android: sichtbarkeit.
GONE Diese Ansicht ist unsichtbar und benötigt keinen Platz für Layoutzwecke . Verwendung mit setVisibility (int) und android: sichtbarkeit.
quelle
Sie können das verwenden,
FocusAwareScrollView
das benachrichtigt, wenn die Ansicht sichtbar wird:Hier ist Klasse:
quelle
Kotlin Weg;
Eine Erweiterung zum Auflisten des Bildlaufs der Bildlaufansicht und zum Abrufen einer Aktion, wenn die untergeordnete Ansicht auf dem Bildschirm angezeigt wird.
Verwenden Sie diese Erweiterungsfunktion für jede scrollbare Ansicht
quelle
Ich weiß, dass es sehr spät ist. Aber ich habe eine gute Lösung. Unten finden Sie das Code-Snippet zum Abrufen des Prozentsatzes der Sichtbarkeit der Ansicht in der Bildlaufansicht.
Stellen Sie zunächst den Touch Listener in der Bildlaufansicht ein, um einen Rückruf für den Bildlaufstopp zu erhalten.
Im obigen Code-Snippet erhalten wir Rückrufe für Touch-Ereignisse in der Bildlaufansicht und veröffentlichen eine ausführbare Datei nach 150 Millis (nicht obligatorisch), nachdem der Rückruf für den Bildlauf gestoppt wurde. In dieser ausführbaren Datei erhalten wir die Position der Bildlaufansicht auf dem Bildschirm und die Höhe der Bildlaufansicht. Rufen Sie dann die direkte Instanz der untergeordneten Ansichtsgruppe der Bildlaufansicht ab und ermitteln Sie die Anzahl der untergeordneten Elemente. In meinem Fall ist das direkte untergeordnete Element der Bildlaufansicht LinearLayout mit dem Namen scrollViewRootChild . Wiederholen Sie dann alle untergeordneten Ansichten von scrollViewRootChild . Im obigen Codeausschnitt sehen Sie, dass ich die Position des untergeordneten Elements auf dem Bildschirm in einem ganzzahligen Array mit dem Namen viewLocation erhalte . Die Ansichtshöhe wird im Variablennamen viewHeight angezeigt . Dann habe ich eine private Methode getViewVisibilityOnScrollStopped aufgerufen. Sie können die interne Funktionsweise dieser Methode anhand der Dokumentation verstehen.
Wenn Sie eine Verbesserung dieses Codes bemerken, tragen Sie bitte dazu bei.
quelle
Am Ende implementierte ich eine Kombination aus zwei der Java-Antworten (@ bill-mote https://stackoverflow.com/a/12428154/3686125 und @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) in Mein Projekt als eine Reihe von Kotlin-Erweiterungen, die entweder standardmäßige vertikale ScrollView- oder HorizontalScrollView-Steuerelemente unterstützen.
Ich habe diese nur in eine Kotlin-Datei namens Extensions.kt geworfen, keine Klasse, nur Methoden.
Ich habe diese verwendet, um zu bestimmen, an welchem Element gefangen werden soll, wenn ein Benutzer in verschiedenen Bildansichten in meinem Projekt nicht mehr blättert:
Beispiel für die Verwendung, durchlaufen der LinearLayout-Kinder von scrollview und Protokollieren von Ausgaben:
quelle
var
und unterdrückst du ide hinweis?Mit der @ Qberticus-Antwort, die auf den Punkt gebracht wurde, aber übrigens großartig war, habe ich eine Reihe von Codes zusammengestellt, um zu überprüfen, ob bei jedem Aufruf einer Bildlaufansicht und beim Scrollen die @ Qberticus-Antwort ausgelöst wird und Sie tun können, was Sie wollen, in meinem Fall habe ich eine soziales Netzwerk mit Videos Wenn ich also die Ansicht auf dem Bildschirm zeichne, spiele ich die gleiche Idee wie Facebook und Instagram. Hier ist der Code:
quelle