¿Cuál es la diferencia entre getWidth / Height () y getMeasuredWidth / Height () en el SDK de Android?

88

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 la pasada de medición (el método onMeasure ), mientras que las dimensiones del dibujo son el tamaño real en pantalla. Particularmente, la documentación dice que:

Estos valores pueden, pero no necesariamente, ser diferentes del ancho y alto medidos.

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 debería 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? Intenté buscar en el código fuente de Ver , pero no puedo entender cómo se usa el ancho / alto medido para calcular el ancho / alto final. Quizás tenga algo que ver con el acolchado, pero no estoy seguro.

lgfischer
fuente
Creo que estas medidas pueden ser diferentes en caso de que se agregue un pergamino a la vista.
Yury
Tal vez, pero desarrollé un ViewGroup personalizado y esto está sucediendo en mi código. No estoy tratando con el desplazamiento hasta el punto en que ocurre este comportamiento. Así que creo que debería haber más que un desplazamiento involucrado en esto.
lgfischer
Confirmo, también desarrollé un ViewGroup personalizado para forzar una relación de aspecto determinada: forcé el ancho y la altura medidos (más bajos o iguales a los propuestos), pero obtuve como resultado el ancho y la altura reales no cambiados (no los medidos). No tiene relación con scroll. Realmente no puedo encontrar una manera de forzar el ancho y la altura reales.
ARLabs

Respuestas:

96

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

Déjame dar un ejemplo,

Se pide a un widget que se mida a sí mismo. El widget dice que quiere tener 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 hijos 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 de onLayout.

para resumir .

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

Además,
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.

Prakash Nadar
fuente
es decir, siempre deberíamos utilizar getWidth / getHeight para obtener la dimensión "real" de una vista, ¿verdad?
suitianshi
1
Sí, pero si está haciendo su propio diseño, entonces debería usarmedWidth en lugar de width.
Prakash Nadar
Entonces, ¿cuál es el propósito de establecer dimesions dentro de onMeasure ()? Quiero decir, el pase de diseño es el último, en el que establece las dimensiones finales de la vista, posiblemente independientemente de las dimensiones medidas
edoardotognoni
@edoardotognoni depende del diseño (LinearLayout, RelativeLayout o su diseño personalizado), para dar el tamaño y la posición correctos a la vista.
Prakash Nadar
Ok, digamos que la vista dice "Me gustaría estas dimensiones". Mientras que el diseño dice "Tendrás estas dimensiones". ¿Es correcto?
edoardotognoni