¿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?
- Webview dentro de NestedScrollView causa problema de altura
- Superposición de contenido por encima de AppBarLayout utilizando nuevo diseño de material
- Android - Problemn al establecer la visibilidad en CoordinatorLayout
- Cómo deshabilitar "expandir" de AppBarLayout en el fragmento que tiene un NestedScrollView?
- Espacio adicional utilizando el diseño del coordinador mientras se desplaza
(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
- Agregar vistas debajo de la barra de herramientas en CoordinatorLayout
- FloatingActionButton con SnackBar y CoordinatorLayout no funcionará con proguard
- Barras de fondo de Android que se superponen a la barra de herramientas
- Persistente hoja inferior con vista recicladora
- Android - Disposición del coordinador, diseño de cajones y fragmentos
- Vista fija en el diseño de contenido de Viewpager, bajo CoordinatorLayout
- Utilizar windowTranslucentStatus con la barra de herramientas oculta
- Cómo atenuar el fondo cuando se utiliza la parte inferior de la biblioteca de soporte?
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 sí 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.
- Cómo convertir el archivo WAV / OGG a archivo FLAC en Android?
- Cómo saber cuándo se completa un ListView Android