La documentación de Android dice que hay dos tamaños para una vista, las dimensiones medidas y las dimensiones del dibujo . La dimensión medida es la calculada en el paso de medición (el método onMeasure ), mientras que las dimensiones del dibujo son el tamaño real en pantalla. En particular, la documentación dice que:

These values may, but do not have to, be different from the measured width and height.

Entonces, mi pregunta es: ¿qué podría hacer que la dimensión del dibujo sea diferente de la dimensión medida? Si el método onMeasure(int,int) respeta los requisitos de diseño (dados como los parámetros widthMeasureSpec y heightMeasureSpec , ¿cómo podría el SDK decidir que la vista debe tener un tamaño de dibujo diferente?

Además, ¿cómo/dónde en el código fuente de Android se usa el ancho/alto medido para calcular el ancho/alto del dibujo? Traté de buscar en el código fuente de View , pero no puedo entender cómo se usa el ancho/alto medido para calcular el ancho/alto final. Tal vez tenga algo que ver con el relleno, pero no estoy seguro.

respuesta

Como sugiere el nombre, el ancho/alto medido se usa durante la fase de medición y diseño.

Déjame dar un ejemplo,

Se le pide a un widget que se mida a sí mismo. El widget dice que quiere ser de 200 px por 200 px. Esto se mide ancho/alto.

Durante la fase de diseño, es decir, en el método onLayout. El método puede usar el ancho/alto medido de sus elementos secundarios o asignar un nuevo ancho/alto llamando al método de diseño de la vista.

digamos que el método onLayout llama a childview.layout(0,0,150,150) ahora el ancho/alto de la vista es diferente al ancho/alto medido.

Sugeriría no usar el método de ancho/alto medido fuera del diseño.

para resumir .

  1. onMeasure -> configura el ancho medido/altura medida
  2. onLayout -> configura el ancho/alto del widget.

adicionalmente
public void View.layout(int l, int t, int r, int b)
parece ser el lugar donde ocurre la asignación de posición y tamaño.