Red de conocimiento informático - Conocimiento informático - Código fuente del método de entrada de Android

Código fuente del método de entrada de Android

Actualmente, la adaptación comúnmente utilizada de la barra de estado inmersiva es generalmente una configuración estilística.

& litem name = " Android: ventana de navegación translúcida" & gtfalse & lt/item & gt;

& litem name = " Android: ventana de navegación translúcida " & gt; /item>

O establezca la bandera de la ventana, por ejemplo:

if (build. SDK_INT & gt= 21) {

int option = Ver . System_UI_Logo_Layout_Fullscreen

|Ver. SISTEMA _ UI _ FLAG _ DISEÑO _ ESTABLE

vista de decoración setsystemuivisibility(opción);

window.setStatusBarColor(Color.Transparent

}

}

p>

Luego coopere con:fitsSystemWindows = true para resolver el problema de que algunos controles no requieren inmersión.

Por supuesto, hay más salvajes que fijan directamente la altura de la barra de estado, como tim, NetEase Cloud Music, mobile Taobao, etc.

Cuando la altura de la barra de estado es 0, se expone instantáneamente. Por supuesto, también los hay buenos, como WeChat.

En el desarrollo real, estas API no pueden satisfacer nuestras búsquedas visuales en absoluto, y la más común es la página de inicio. Algunas pestañas requieren inmersión y otras no, por lo que no se puede lograr a la perfección.

Luego, configure la barra de navegación virtual

& litem name = "Android:window translucent Navigation" & gttrue & lt/item & gt; barra de navegación. Hay algunos otros problemas que no son demasiado problemáticos de resolver, por lo que no entraré en detalles aquí.

Otro problema es que cuando aparece el teclado virtual, el diseño se sobrescribe o desaparece. Por supuesto, este problema también es fácil de resolver.

Establezca Android: Modo de entrada del software de Windows = "Ajustar cambio de tamaño" o ajustePan para resolver fácilmente la mayoría de los problemas.

Aunque los tres problemas anteriores pueden ser complejos o sencillos de resolver, resulta algo complicado alcanzar algunos requisitos exigentes.

Si se pueden monitorear los cambios de altura de la barra de estado, la barra de navegación y el teclado virtual, ¿se pueden resolver y se pueden implementar algunas funciones más interesantes?

¿Cómo monitorear los cambios de altura de la barra de estado, barra de navegación y teclado virtual?

A continuación, primero estudiamos cómo el sistema maneja estos problemas.

Primero, usemos el visor de diseño para ver el diseño de la interfaz.

Como puede ver, cuando la barra de estado inmersiva no está configurada, paddingtop y marginBottom están configurados para la vista 0 de la vista decorativa, y las dos vistas se superponen en la parte superior como el color de la barra de estado y barra de navegación.

Cuando aparece el método de entrada, también se logra configurando el paddingBottom de la vista 0 de la revisión, lo que significa que la vista 0 de la revisión puede escuchar lo que queremos.

Al observar el código fuente del sistema, finalmente encontré el método de vew despachoApplyWindowInsets.

Mira atentamente este código fuente.

Finalmente, encontré una manera de configurar el relleno para la vista.

Al mismo tiempo, se descubrió que decorView restableció el método onApplyWindowInsets, donde se agregaba una vista de fondo como color de la barra de estado y la barra de navegación.

DecorView*** tiene cinco llamadas lógicas a addView, por lo que no entraré en cómo implementarlas.

Ahora que conocemos la solución del sistema, solo necesitamos recibir el monitoreo correspondiente cuando el sistema llame a despachoApplyWindowInsets.

Afortunadamente el sistema nos proporciona el método setOnApplyWindowInsetsListener.

Verifiquemos nuestros resultados.

En este punto, se han discutido los aspectos centrales a discutir y solo queda la cuestión del uso.

En cuanto a cómo utilizarlo, puedes elegir según tu situación personal. Sólo hay dos formas de utilizarlo.

Aquí hay una advertencia. setOnApplyWindowInsetsListener destruirá el mecanismo de entrega de eventos del sistema.

Sin embargo, se puede solucionar llamando manualmente a onApplyWindowInsets.

val view group = ventana . dec ver como grupo de vista

view group . setonapplywindowinsets escucha { v,insets-& gt; insets ")

5. Publicaciones

//Aquí notificamos dinámicamente los controles que deben adaptarse a la barra de estado, la barra de navegación y el método de entrada.

}

v.onapplywindowsets(insets)

}

2. El plan de adaptación para interrumpir completamente el sistema lo manejamos nosotros mismos. , por ejemplo:

grupo de vista val = ventana vista dec como grupo de vista

grupo de vista[0]. setonapplywindowinsets listener { v,insets-& gt;

println(" - $insets ")

5. Publicaciones

//Las notificaciones dinámicas deben ser apropiadas aquí Controles con barra de estado, barra de navegación y método de entrada.

insets.run {

//Depende de la situación

//v . set padding(stableinesetleft, stableInsetTop, stableInsetRight, stableInsetBottom)

.

v .set padding(systemwindowinsettleft, systemWindowInsetTop, systemWindowInsetRight, 0)

val h = findViewById<View>(R.id.llBottom)? . ¿altura? : 0

findViewById & ltView>(R.id.flEt)? . setPadding(0, 0, 0, systemWindowInsetBottom-h)

}

}

insets .consumesystemwindowinsets()

}

En cuanto a por qué necesita monitorear en la vista 0 de decorView, debe investigarlo usted mismo.

Entre ellos, el segundo método puede lograr un efecto de barra de estado inmersivo sin establecer ningún estilo o bandera para la actividad. También es más jugable. Si coincide,

& litem name = "Android:window translucent Navigation" & gttrue & lt/item & gt;Será más jugable. En cuanto a hasta dónde puede llegar, depende de las ideas de cada uno.

A estas alturas ya está todo escrito.

Finalmente, se presenta un escenario alcanzable:

Cuando aparece el método de entrada, podemos personalizar los controles que deben activarse.