¿Qué es VerticalScrollExtent en Android ScrollView?
De una respuesta a una de mis otras preguntas encontré una demostración de Google de una subclase ListView que permite reordenar el artículo.
La demostración funciona muy bien, pero tengo problemas para entender cómo funciona: Cuando un elemento se arrastra por encima o por debajo de los límites del ListView, el ListView comienza a desplazarse hacia arriba o hacia abajo para mostrar nuevos elementos. El cálculo necesario utiliza diferentes parámetros del subordinado ScrollView:
- Guardar y volver a cargar ListView utilizando las preferencias compartidas
- Seleccione el primer elemento en ListView con Cursor Loader
- Desactivar desplazamiento de Android y hacer clic para listview
- Android Listview reduce la velocidad de desplazamiento
- Anulación de Android ArrayAdapter
public boolean handleMobileCellScroll(Rect r) { int offset = computeVerticalScrollOffset(); int height = getHeight(); int extent = computeVerticalScrollExtent(); int range = computeVerticalScrollRange(); int hoverViewTop = r.top; int hoverHeight = r.height(); if (hoverViewTop <= 0 && offset > 0) { smoothScrollBy(-mSmoothScrollAmountAtEdge, 0); return true; } if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) { smoothScrollBy(mSmoothScrollAmountAtEdge, 0); return true; } return false; }
-
height
es la altura del propio ListView -
offset
es la posición de desplazamiento = cuántas unidades / píxeles se han desplazado hacia arriba / abajo -
range
es la altura del contenido completo. -
extent
– bueno, ¿qué es esto?
ListView
hereda computeVerticalScrollExtent()
de la View
y el docu dice:
Calcule el desplazamiento vertical del pulgar de la barra de desplazamiento vertical dentro del rango horizontal. Este valor se utiliza para calcular la posición del pulgar dentro de la pista de la barra de desplazamiento.
Si se mira el código computeVerticalScrollExtent()
no está implementado por uno de los submarinos pero sólo directamente por View
: Simplemente devuelve la altura de la vista.
Esto tiene sentido: Si el ListView / ScrollView tiene una altura de 500, la parte del contenido de desplazamiento que es visible a la vez también es 500. ¿Es este el significado de ScrollExtent? ¿Por qué es necesario ScrollExtent? ¿Por qué no usar simplemente getHeight () directamente?
Creo que estoy perdiendo algo y estoy contento con cualquier pista!
- Lista y lista de adaptadores para mostrar json
- TouchDelegate aplicado a ListView sólo responde al evento de clic
- Necesito llamar a un número perticular en los contactos
- Mostrar menú contextual bajo demanda en Android
- Android hide listview scrollbar?
- SimpleCursorAdapter con ImageView y TextView
- ListView para la aplicación de mensajería muestra un diseño incorrecto listItem después de desplazarse
- Entradas duplicadas en ListView
Es un poco tarde, pero espero que esté bien.
1) El método es realmente implementado por las subclases. Por ejemplo, esto es lo que parece para AbsListView
(superclase de ListView
).
2) La altura de la vista puede ser diferente de la altura de su desplazamiento vertical – imagínese una View
con acolchado extraño / superior.
Estos dos puntos prácticamente hacen que otras preguntas sean irrelevantes 🙂
-
Compute * ScrollOffset – Define la distancia entre el inicio del área desplazable y la parte superior de la ventana de vista actual dentro del área desplazable. Por ejemplo, si su lista tiene 10 elementos y se ha desplazado hacia abajo por lo que el tercer elemento está en el elemento más visible, entonces el desplazamiento es 3 (o 3 * itemHeight, ver más abajo).
-
Calcula * ScrollExtent – Define el tamaño de la ventana de vista actual dentro del área desplazable. Así, por ejemplo, si su lista tiene 10 elementos y actualmente puede ver 5 de esos elementos, entonces la extensión es 5 (o 5 * itemHeight, ver más abajo).
-
Compute * ScrollRange – Define el tamaño del área desplazable actual. Así por ejemplo, si su lista tiene 10 elementos, entonces el rango es 10 (o 10 * itemHeight, ver más abajo).
Tenga en cuenta que todos estos métodos pueden devolver valores en diferentes unidades dependiendo de su implementación, por lo que para los ejemplos anteriores, estoy utilizando los índices, pero en algunos casos estos métodos devolverán valores de píxeles equivalentes a la anchura o altura de los elementos.
En particular, LinearLayoutManager de RecyclerView devolverá índices si la función de "scrollbar liso" está habilitada, de lo contrario devolverá valores de píxel. Consulte ScrollbarHelper
en la biblioteca de soporte para obtener más información.
Lectura adicional: https://groups.google.com/forum/#!topic/android-developers/Hxe-bjtQVvk
Este es un código de ejemplo que puede ayudarle a entender cómo obtener scrollBar arriba y abajo utilizando computeVerticalScrollExtent:
scrollbarTop = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*this.computeVerticalScrollOffset(); scrollbarBottom = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*(this.computeVerticalScrollExtent()+this.computeVerticalScrollOffset());
- Pegar sin formato de texto enriquecido en EditText
- La alineación no es correcta al agregar vista dinámicamente a GridLayout