Android obtiene el tamaño del control en onCreate.
imageView.measure(w, h); - gt; llama al método de medición de view->; método OnMeasure(), código fuente de onMeasure:
Nulo protegido en medida( int ancho medidaspec, int alturaMeasureSpec) {
setMeasuredDimension(getDefaultSize(getsuggestedminimumwwidth()), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightmessegypt));
}
on medida- gt; setMeasuredDimension()- gt; getDefaultSize() gt; getSuggestedMinimumHeight()
Este es el proceso de llamada al método en la fuente onMeasure, la fuente del análisis inverso. método El código es:
getSuggestedMinimumHeight():
protected int getSuggestedMinimumHeight(){
return (mBackground == null)? mMinHeight: max(mMinHeight, mbackground. getminimumheight());
}
Si el fondo está vacío, tome el valor de mminHeight; si el fondo no está vacío, tome el máximo; valor (mMinHeight, mbackground. getminimumheight()) El valor máximo de la altura del fondo y mminheight.
A continuación, después de obtener el valor sugerido, verifique el código fuente de getDefaultSize:
//El primer parámetro es el valor sugerido obtenido por el método getSuggestedMinimumHeight. El segundo parámetro son las especificaciones de ancho y alto calculadas por el sistema, que es el valor de MeasureSpec, es decir, w o h en medida (w, h).
public static int getDefaultSize(int tamaño, int medidaSpec) {
int resultado = tamaño
//int w = Ver. medida especificación makemameasurespec(0, vista. Especificación de medición no especificada);
//El modo de especificación anterior no es: vista.
¿Especificación de medición no especificada?
int spec mode = medida especificación get mode(measure spec);
//¿No es el modo de especificación solo el 0 anterior?
int specSize = medida especificación . getsize(medida especificación);
Cambiar (specMode) {//¿Qué hay aquí? Controlar. Medidas no especificadas, ¿entiendes?
Especificaciones de medidas de la caja. Sin especificar: //
//resultado es el valor que devolverá getDefaultSize. Dependiendo del modificador, ¿qué devuelve getDefaultSize?
//¿No es el primer parámetro del método? ¿No es este parámetro el valor recomendado para ancho y alto?
//Es decir, max (mminheight, mbackground.getminimummweight());
Resultado = tamaño
Break; Especificaciones de medidas de cajas. Hasta (_ u):
Especificación de medición de casos. Para ser precisos:
result = specSize
Break;
}
Devuelve el resultado
}
Bien, ahora el método setMeasuredDimension, código fuente:
Dimensión medida del conjunto de vacío final protegido (int ancho medido, int altura medida) {
Óptica booleana = isLayoutModeOptical (esto);
if(optical! = isLayoutModeOptical(mParent)){
insets insets = getOpticalInsets();
int ancho óptico = inserciones izquierda. inserciones derecha;
int altura óptica = inserciones superior inferior;
Ancho medido = óptico. ancho óptico: -ancho óptico;
Altura de medición = óptico? altura óptica: -altura óptica;
}
mmemeasuredwidth = ancho medido //Este es el valor al que prestar atención en este método.
mmemeasuredheight = altura medida; //Igual que arriba
mPrivateFlags |= tamaño de medida PFLAG establecido;
}
Este código es Hasta luego, hay muchas cosas, todos deberían prestar atención a los comentarios del código. ¿Cuál es el uso de las dos líneas de código que se indican arriba?
Si miras el código fuente del otro método, sabrás, getMeasureWidth() y getMeasureHeight():
public final int getMeasuredWidth(){
Devuelve el ancho medido ampMEASURED_SIZE_mask;
}
public final int getMeasuredHeight(){
Devuelve la altura medida.
MEASURED _ TAMAÑO _ Máscara;
}
¿No devuelven estos dos métodos el ancho y el alto medidos llamando a medida? ¿No es el valor del código marcado en las dos líneas anteriores?
Ahora para responder a tu pregunta:
Este es el código. Me gustaría preguntar por qué un parámetro en makeasurespec (0, view.measurespec.unspecified) es 0. ¿Qué quieres decir?
El primer parámetro debe ser la especificación de medición obtenida por el sistema después de medir la vista. Resulta que el sistema llama automáticamente a esta medida después de medir el ancho y el alto. Acabamos de hacer lo que el sistema va a hacer aquí, entonces, ¿por qué este parámetro es 0? Dado que queremos utilizar este método para medir el ancho y el alto de la vista, no tememos que el sistema no llame automáticamente a este método antes de llamar al método getMeasureWidth/Height y no obtenga un resultado con un valor de 0. Eso Es decir, llamamos a este método de forma predeterminada, es decir, el sistema no dibuja la vista, por lo que el método de medida se llama directamente, por lo que el ancho y el alto son ambos 0. De hecho, no importa cuál sea la primera configuración de parámetro de makemeasureSpec, porque el valor final no es el valor de la primera configuración de parámetro. Creo que mi expresión es confusa, pero si está familiarizado con el código fuente del mecanismo de dibujo de Measure, debería estar bien. Le recomiendo que lea el blog de csdn, que contiene un análisis completo del código fuente. Si no lo sabías antes, leer su blog debería resultarte un poco esclarecedor.