java - ¿Qué son los WindowInsets?
android android-layout (2)
Estoy tratando de aprender sobre el sistema operativo Android y mientras leía la aplicación Google I / O 2014, me encontré con
WindowInsets
.
Si alguien puede explicar lo que son, sería de gran ayuda.
Gracias.
Puedes aprender todo sobre
WindowInsets aquí.
WindowInsets
proporciona el área de la ventana que la aplicación puede utilizar.
Por sí solo no es de mucha utilidad.
Su verdadero propósito se produce cuando anula
View.onApplyWindowInsets
o implementa
View.OnApplyWindowInsetsListener
.
Puede leer sobre ellos aquí:
View.onApplyWindowInsets
y
View.OnApplyWindowInsetsListener
Escucha para aplicar inserciones de ventana en una vista de forma personalizada.
Las aplicaciones pueden optar por implementar esta interfaz si desean aplicar una política personalizada a la forma en que se tratan las inserciones de ventana para una vista. Si se establece un OnApplyWindowInsetsListener, se llamará a su método onApplyWindowInsets en lugar del método onApplyWindowInsets de View. El oyente puede llamar opcionalmente al método onApplyWindowInsets de View para aplicar el comportamiento normal de View como parte del propio.
En resumen, anular esto le permitirá controlar el área de la ventana disponible para su Vista.
WindowInsets
son inserciones (o tamaños) de vistas del sistema (por ejemplo, barra de estado, barra de navegación), que se aplican a la ventana.
Sería fácil de entender en un ejemplo concreto. Imagen de este escenario:
Ahora, no desea que
WindowInsets
se aplique a
ImageView
fondo, porque en ese caso,
ImageView
estaría rellenado por la altura de la barra de estado.
Pero sí desea que se apliquen inserciones a la
Toolbar
de
Toolbar
, porque de lo contrario, la
Toolbar
se dibujaría en algún lugar a mitad de la barra de estado.
La vista declara el deseo de aplicar
WindowInsets
en xml diciendo:
android:fitsSystemWindows="true"
En este ejemplo, no puede aplicar
WindowInsets
al diseño raíz, porque el diseño raíz consumiría
WindowInsets
y el
ImageView
estaría relleno.
En su lugar, puede usar
ViewCompat.setOnApplyWindowInsetsListener
para aplicar inserciones a la barra de herramientas:
ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin =
insets.getSystemWindowInsetTop();
return insets.consumeSystemWindowInsets();
});
Tenga en cuenta que esta devolución de llamada se llamaría cuando el diseño raíz de la
Toolbar
de
Toolbar
pase
WindowsInsets
a sus elementos
WindowsInsets
.
Los diseños como
FrameLayout
,
LinearLayout
no,
DrawerLayout
,
CoordinatorLayout
sí.
Puede subclasificar su diseño, por ejemplo,
FrameLayout
y anular
onApplyWindowInsets
:
@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
int childCount = getChildCount();
for (int index = 0; index < childCount; index++)
getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets
return insets;
}
Hay una buena publicación de blog en medio de Ian Lake sobre estas cosas, también la presentación de "Convertirse en un instalador de ventanas maestro" por Chris Banes.
También he creado
un artículo detallado en Medium
sobre
WindowInset
s.
Más recursos: