Tengo una ScrollView
que contiene una serie de Views
. Me gustaría poder determinar si una vista está actualmente visible (si alguna parte de ella está siendo mostrada actualmente por el ScrollView
). Esperaría que el siguiente código haga esto, sorprendentemente no:
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
fuente
fuente
Respuestas:
Use en
View#getHitRect
lugar deView#getDrawingRect
en la vista que está probando. Puede usarView#getDrawingRect
enScrollView
lugar de calcular explícitamente.Código de
View#getDrawingRect
:Código de
View#getHitRect
:fuente
Esto funciona:
fuente
GridView
/ListView
/GridViewWithHeader
trabajar conSwipeRefreshLayout
.getHitRect
devuelve un rect en las coordenadas principales, perogetLocalVisibleRect
devuelve un rect en las coordenadas locales de la vista de desplazamiento, ¿no?Si desea detectar que la vista es TOTALMENTE visible:
fuente
Mi solución es usar
NestedScrollView
elemento de desplazamiento:fuente
Para ampliar un poco la respuesta de Bill Mote usando getLocalVisibleRect, es posible que desee verificar si la vista solo es parcialmente visible:
fuente
Esta extensión ayuda a detectar la vista totalmente visible.
También funciona si
View
es hijo de un hijo de ... deScrollView
(por ejemplo:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Nota
1)
view.getY()
yview.getX()
devuelva el valor x, y al PRIMER PADRE .2) Aquí hay un ejemplo sobre cómo
getDrawingRect
devolverá Linkfuente
fuente
Me enfrenté al mismo problema hoy. Mientras busqué en Google y leí la referencia de Android, encontré esta publicación y un método que terminé usando;
Agradable de ellos no solo para proporcionar Rect sino también booleano que indica si View es visible en absoluto. En el lado negativo, este método no está documentado :(
fuente
Si quieres detectar si tu
View
está completamentevisible
, prueba con este método:Estrictamente hablando, puede obtener la visibilidad de una vista con:
Los posibles valores constantes de la visibilidad en una Vista son:
VISIBLE Esta vista es visible. Usar con setVisibility (int) y android: visibilidad.
INVISIBLE Esta vista es invisible, pero aún ocupa espacio para propósitos de diseño. Usar con setVisibility (int) y android: visibilidad.
IDA Esta vista es invisible y no ocupa espacio para el diseño. Usar con setVisibility (int) y android: visibilidad.
fuente
Puede usar el
FocusAwareScrollView
que notifica cuando la vista se hace visible:Aquí hay clase:
fuente
Camino de Kotlin;
Una extensión para enumerar el desplazamiento de la vista de desplazamiento y obtener una acción si la vista secundaria es visible en la pantalla.
Use esta función de extensión para cualquier vista desplazable
fuente
Sé que es muy tarde. Pero tengo una buena solución. A continuación se muestra el fragmento de código para obtener el porcentaje de visibilidad de la vista en la vista de desplazamiento.
En primer lugar, configure el oyente táctil en la vista de desplazamiento para obtener la devolución de llamada para detener el desplazamiento.
En el fragmento de código anterior, recibimos devoluciones de llamadas para eventos táctiles de vista de desplazamiento y publicamos un ejecutable después de 150 milis (no obligatorio) después de detener la devolución de llamada para desplazamiento. En ese ejecutable obtendremos la ubicación de la vista de desplazamiento en la pantalla y la altura de la vista de desplazamiento. Luego obtenga la instancia del grupo de vista hijo directo de la vista de desplazamiento y obtenga los recuentos secundarios. En mi caso, el elemento secundario directo de la vista de desplazamiento es LinearLayout llamado scrollViewRootChild . Luego, repita todas las vistas secundarias de scrollViewRootChild . En el fragmento de código anterior, puede ver que obtengo la ubicación del niño en la pantalla en una matriz entera llamada viewLocation , obtenga la altura de la vista en el nombre de la variable viewHeight . Luego llamé a un método privado getViewVisibilityOnScrollStopped. Puede comprender el funcionamiento interno de este método leyendo la documentación.
Si siente alguna mejora en este código, por favor contribuya.
fuente
Terminé implementando una combinación de dos de las respuestas de Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 y @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) en mi proyecto como un conjunto de extensiones de Kotlin, que admiten controles ScrollView verticales u HorizontalScrollView estándar.
Acabo de lanzar estos en un archivo Kotlin llamado Extensions.kt, sin clase, solo métodos.
Los utilicé para determinar a qué elemento ajustar cuando un usuario deja de desplazarse en varias vistas de desplazamiento en mi proyecto:
Ejemplo de uso, iterando a través de los elementos secundarios LinearLayout de scrollview y las salidas de registro:
fuente
var
y suprimiendo la pista de ide?Utilizando la respuesta @Qberticus, que era al punto pero por cierto genial, compilé un montón de códigos para verificar si cada vez que se llama a una vista de desplazamiento y se desplaza, activa la respuesta @Qberticus y puedes hacer lo que quieras, en mi caso tengo un red social que contiene videos, así que cuando la vista se dibuja en la pantalla, reproduzco el video con la misma idea que Facebook e Instagram. Aquí está el código:
fuente