Cómo obtener el tamaño de la interfaz activa en el desarrollo de Android
En términos generales, el tamaño de la ventana activa es igual al tamaño de toda la pantalla, pero no ocupa toda la pantalla. Para entender esto, analicemos primero cómo se divide el área de la ventana activa.
Sabemos que normalmente hay una barra de estado encima de la ventana activa para mostrar la señal 3G, el consumo de energía y otros iconos, como se muestra en la Figura 1.
Figura 1 Diagrama esquemático del área de contenido de la ventana activa
Después de eliminar el área ocupada por la barra de estado de la ventana activa, el área obtenida se denomina área de contenido . Como sugiere el nombre, el área de contenido se utiliza para mostrar el contenido de la ventana activa. Resumámoslo nuevamente. Supongamos que hay un área similar a la barra de estado alrededor de la ventana activa. Después de eliminar estas áreas, el área central se llama área de contenido y el área compuesta por el área eliminada se llama Inserciones de contenido. El área del límite de contenido de la ventana activa se puede describir mediante un cuadrilátero (contenido izquierdo, contenido superior, contenido derecho, contenido inferior), donde contenido izquierdo, contenido derecho, contenido superior y contenido inferior se utilizan para la descripción respectivamente. La distancia entre los bordes izquierdo y derecho del área de contenido y el área de la ventana.
También sabemos que la ventana activa a veces necesita mostrar la ventana del método de entrada, como se muestra en la Figura 2.
Figura 2 Diagrama esquemático del área visible de la ventana activa
En este momento, es posible que el tamaño del área de contenido de la ventana activa no cambie, dependiendo de su modo de entrada suave. Suponemos que el área de contenido de la ventana activa no ha cambiado, pero algunas áreas en la parte inferior están bloqueadas por la ventana del método de entrada, es decir, parte del contenido en la parte inferior es invisible. Después de eliminar el área ocupada por la barra de estado y la ventana del método de entrada de la ventana activa, el área resultante se denomina área visible. De manera similar, abstraigamos un poco más y supongamos que hay un área similar a la barra de estado y la ventana del método de entrada alrededor de la ventana activa. Después de eliminar estas áreas, el área central se llama área visible y el área compuesta por el área eliminada. se llama Inserciones visibles. El área límite visible de la ventana activa se puede describir mediante un cuadrilátero (visible-izquierda, visible-arriba, visible-derecha, visible-abajo), donde visible-izquierda, visible-derecha, visible-arriba, visible-abajo se utilizan para describir las distancias de los límites superior e inferior izquierdo y derecho entre el área visible y el área de la ventana, respectivamente.
En la mayoría de los casos, el área de contenido y el área visual de la ventana activa tienen el mismo tamaño, y el área ocupada por la barra de estado y la ventana del método de entrada también se denomina área de decoración de la pantalla. Después de comprender estos conceptos, podemos inferir que WindowManagerService realmente necesita calcular el tamaño total de la ventana activa y el tamaño de los márgenes del área de contenido y los márgenes del área visual en función del tamaño de la pantalla y las posibles barras de estado y ventanas de métodos de entrada. Con estos tres datos, la ventana activa puede medir, diseñar y dibujar los elementos de la interfaz de usuario que contiene.
A partir del análisis del proceso de creación de la superficie de dibujo de la ventana de la aplicación de Android (Actividad), podemos saber que el proceso de aplicación comienza desde la función miembro performTraversals de la clase ViewRoot y solicita WindowManagerService para calcular el Tamaño de una ventana activa. Por lo tanto, a continuación analizaremos el proceso de cálculo de un tamaño de ventana activa a partir de la función miembro performTraversals de la clase ViewRoot, como se muestra en la Figura 3.
Figura 3 Proceso de cálculo del tamaño de la ventana activa
Este proceso se puede dividir en 11 pasos A continuación, analizaremos cada paso en detalle.
Paso 1.
ViewRoot.performTraversals
Esta función está definida en el archivo frameworks/base/core/Java/Android/view/view root Java y es muy compleja de implementar. A * * * tiene 600 líneas, pero la mayor parte del código se utiliza para calcular el tamaño de la ventana activa. Leámoslo en secciones:
[java] ver implementación del controlador de extensión ViewRoot de la clase final Plaincopypublic
Ver padre,
Ver. AttachInfo.Callbacks {
......
PerformTraversals anulados privados() {
......
Vista final host = mView
......
int deseadoWindowWidth
int deseadoWindowHeight
int childWidthMeasureSpec
int childHeightMeasureSpec
......
Rect frame = mWinFrame
if (mFirst) {
... ...
Mostrar paquete de métricas métricas =
mView.getContext(). obtenerRecursos(). getDisplayMetrics();
ancho de ventana deseado = métricas de ancho del paquete;
alto de ventana deseada = métricas de altura del paquete;
}de lo contrario{
AnchoVentanaDesired = marco . ancho();
AltoVentanadesired = altura marco();
if (AnchoVentanadesired!= mAncho ||AlturaVentanadeseado!= altura MH){
......
windowResizesToFitContent = true;
}
}
Copiar código
Este código se utiliza para obtener el ancho actual deseadoWindowWidth y la altura actual deseadaWindowHeight de la ventana activa.