¿Qué es la renderización excesiva en Android? ¿Cómo detectar y optimizar? Cuando una actividad recibe foco, se le pedirá que dibuje su diseño. El marco de Android maneja este proceso de dibujo, pero la actividad debe proporcionar el nodo raíz de su jerarquía de diseño. El dibujo comienza desde el nodo raíz del diseño. Se pidió medir y dibujar el árbol de distribución. El dibujo se realiza recorriendo el árbol de diseño y renderizando cada vista que cruza el área no válida. Por lo tanto, cada grupo de vistas es responsable de solicitar que se dibujen sus subvistas (mediante el método draw()), y cada vista es responsable de dibujarse a sí misma. Dado que el árbol se recorre secuencialmente, esto significa que el nodo padre se dibuja primero (es decir, detrás de la pantalla) y luego sus hermanos se dibujan en el orden en que aparecen en el árbol. El marco no dibujará vistas que no estén dentro del área no válida y también dibujará el fondo de la vista. Puede forzar que se vuelva a dibujar una vista llamando a invalidate(). Hay dos pasos para dibujar un diseño: el proceso de medición y el proceso de diseño. El proceso de medición se implementa en medida (int, int), que es un recorrido de arriba hacia abajo del árbol de vista. Cada vista reduce las especificaciones de tamaño de forma recursiva. Al final del proceso de medición, cada vista guarda sus propios valores de medición. El segundo proceso se realiza en diseño (int, int, int, int), que también es de arriba hacia abajo. Durante este proceso, cada nodo principal es responsable de posicionar todos sus nodos secundarios utilizando las dimensiones calculadas durante el proceso de medición. Cuando regresa el método medida() de la vista, se deben establecer sus valores getMeasuredWidth() y getMeasuredHeight(), así como los valores de todos los nodos secundarios de la vista. Los valores de ancho y alto de las medidas de la vista deben ajustarse a las restricciones introducidas por la vista principal. Esto garantiza que todos los nodos principales acepten los valores métricos de todos sus nodos secundarios después del procesamiento de métricas. Una vista principal puede llamar al método medida() varias veces en sus vistas secundarias. Por ejemplo, un padre puede llamar a medida en dimensiones no especificadas para conocer sus dimensiones y luego llamar a medida() nuevamente con los valores reales. Si el tamaño combinado sin restricciones de todas las vistas secundarias es demasiado grande o demasiado pequeño, el padre intervendrá y establecerá el tamaño. reglas para el segundo proceso (es decir, si los nodos secundarios no pueden saber desde ****ty cuánto espacio ocupa cada uno, el nodo padre intervendrá y establecerá las reglas para el segundo proceso). Para iniciar el diseño, llame a requestLayout(). Normalmente se llama a este método cuando la vista cree que ya no se ajusta a los límites actuales. Las vistas utilizan la clase View.MeasureSpec para indicar a las vistas principales cómo medir y posicionar. La clase base LayoutParams simplemente describe las dimensiones (alto y ancho) de la vista. Para cada tamaño, puede especificar uno de los siguientes: - un valor exacto - FILL_PARENT, que indica que la vista quiere tener el mismo tamaño que la vista principal (menos el relleno). - WRAP_CONTENT, que indica que la vista solo quiere ser tan grande como el contenido que envuelve (más el relleno). Para diferentes subclases de ViewGroup, existen subclases de LayoutParams correspondientes. Por ejemplo, RelativeLayout tiene su propia subclase LayoutParams que contiene funcionalidad para centrar subvistas horizontal y verticalmente. Las MeasureSpecs se utilizan para eliminar los requisitos de medición a lo largo del árbol desde los nodos principales a los nodos secundarios. MeasureSpecs puede ser uno de tres modos: - Sin especificar: utilizado por la vista principal para determinar las dimensiones requeridas de sus vistas secundarias. Por ejemplo, un diseño lineal podría llamar a medida() en sus subvistas, estableciendo la altura en NO ESPECIFICADO y el ancho en EXACTAMENTE 240 para determinar qué altura debe tener la subvista con un ancho de 240 píxeles. - Exacto: utilizado por la vista principal para establecer dimensiones exactas para las vistas secundarias. Las subvistas deben usar este tamaño y asegurarse de que todas sus subvistas se ajusten a este tamaño.
- AT_MOST: la vista principal utiliza esta opción para establecer el tamaño máximo de la vista secundaria. La subvista debe garantizar que ella y todas sus subvistas se ajusten a este tamaño.