¿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:

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!

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()*(thi‌​s.computeVerticalScrollExtent()+this.computeVerticalScrollOffset()); 
  • Disparar un PopupMenu con botones dentro de un elemento ListView
  • Modo de elección en un RecyclerView?
  • Devolución de llamada a notifyDataSetChanged
  • Agregar la barra de progreso en la parte inferior de una vista de lista
  • Mantener la posición de desplazamiento cuando se agrega a ListView con desplazamiento inverso sin fin
  • ¿Cuál es la forma correcta de mostrar múltiples tipos de filas en una vista de lista reactiva-nativa?
  • Altura dinámica para la fila ListView en android
  • SetOnItemClickListener no responde para ListView personalizado
  • La altura de ListView llena toda la pantalla, aunque se define como wrap_content
  • Cómo inflar RelativeLayout de XML
  • ¿Cómo agrego un onclicklistener a un botón dentro de un adaptador listview?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.