¿Cómo funciona la matemática de AppBarLayout.ScrollingViewBehavior?

offsetChildAsNeeded el flujo matemático del método offsetChildAsNeeded en AppBarLayout.ScrollingViewBehavior al ejecutar los cambios de desplazamiento.

Como es un método privado y privado es mOffsetDelta , ¿cómo puede monitorizarlos mediante programación?

(No está claro cómo el método utiliza el offset también.)

 private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) { final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior(); if (behavior instanceof Behavior) { // Offset the child, pinning it to the bottom the header-dependency, maintaining // any vertical gap, and overlap final Behavior ablBehavior = (Behavior) behavior; final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop()) + ablBehavior.mOffsetDelta + getVerticalLayoutGap() - getOverlapPixelsForOffset(dependency)); } } 

NOTA: son bienvenidos y podrían ser aceptadas respuestas también las que explican detalles sobre la lógica matemática de getTopBottomOffsetForScrollingSibling() , de (dependency.getBottom() - child.getTop()) , y sobre el contenido de mOffsetDelta

Podrías hacer ingeniería inversa en este código, pero al final es académico porque los simples programadores morales (es decir, no Google) no pueden acceder a los valores y métodos mostrados aquí. Supongo que calculan que cuanto menos de su biblioteca podamos usar , menos informes de fallos presentaremos. Suspiro.

Pero he aquí una breve explicación:

En primer lugar, esa línea de código

  final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); 

Parece ser un vestigio vestigio de una revisión anterior, ya que el offset nunca se usa realmente. La expresión más reciente debe ser un poco más precisa en más casos.

ViewCompat.offsetTopAndBottom() no es una operación establecida (absoluta), sino una operación aditiva (relativa). Así que supongamos que la lógica normal y considere que este comportamiento esencialmente pone la vista de desplazamiento directamente debajo del diseño de la barra de aplicaciones. Por lo general, la parte inferior de la barra de aplicaciones y la parte superior de la vista de desplazamiento tienen el mismo valor. Dado que el diseño de la barra de aplicaciones (dependencia) ha cambiado y la vista de desplazamiento (secundaria) no tiene (todavía), entonces

  dependency.getBottom() - child.getTop() 

Es la cantidad relativa que el desplazamiento vertical del niño necesita ser ajustado.

Si mi lectura del código es correcta, ese mOffsetDelta en el comportamiento del diseño de la barra de aplicaciones es sólo distinto de cero en el caso de que el diseño de la barra de aplicaciones tenga un interpolador de desplazamiento. Normalmente, la barra de aplicaciones en no se moverá en una forma de paralaje, por lo que mOffsetDelta es cero para prácticamente todos los casos que nos importan. getVerticalLayoutGap y getOverlapPixelsForOffset ocupan de los getOverlapPixelsForOffset diseño como overlapTop .

Pero resulta que usted puede hacer la mayor parte de esto sin esos casos de borde en su propia subclase de comportamiento haciendo esto:

  @Override public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { // get the bottom of the app bar layout int bottom = dependency.getBottom(); // position the top of the scrolling view there return setTopAndBottomOffset(bottom); } 

Creo que es un poco más fácil trabajar con compensaciones absolutas en lugar de compensaciones relativas. Por tanto, implementar un comportamiento de desplazamiento es principalmente una cuestión de determinar dónde está la vista dependiente y dónde la vista de desplazamiento debe basarse en eso.

  • Android: el pie de página se desplaza cuando se usa en CoordinatorLayout
  • CoordinatorLayout, AppBarLayout y ToolBar - Barra de herramientas no se desplaza fuera de la pantalla
  • ¿Debe colocarse el CoordinatorLayout en la Actividad o en el Fragmento cuando se trata de fragmentos de desplazamiento y sin desplazamiento?
  • Cómo deshabilitar el desplazamiento de AppBarLayout en CoordinatorLayout?
  • Comportamiento personalizado de CoordinatorLayout
  • Botón de acción flotante que no se muestra completamente dentro de un fragmento
  • Coloque Snackbar en el orden z más alto para evitar ser bloqueado por AutoCompleteTextView desplegable
  • Barra de herramientas en AppBarLayout es desplazable aunque RecyclerView no tiene suficiente contenido para desplazarse
  • Cómo utilizar el diseño del coordinador con el fragmento como "vista de desplazamiento"
  • Android NestedScrollView alinear el contenido en la parte superior
  • NestedScrollView contiene contenido menor que la altura de la pantalla Desplaza en CoordinatorLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.