2011-12-28 14 views
54

Android Documentation says que hay dos tamaños para una vista, dimensiones medidas y dimensiones de dibujo. La dimensión medida es la que se calculó en la medida pase (el método onMeasure), mientras que las dimensiones de dibujo son el tamaño real en la pantalla. Particularmente, la documentación dice que:¿Cuál es la diferencia entre getWidth/Height() y getMeasuredWidth/Height() en Android SDK?

Estos valores pueden, pero no tienen por qué, ser diferentes del ancho y la altura 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 disposición (dada como los parámetros widthMeasureSpec y heightMeasureSpec, ¿cómo puede el SDK decide que la vista debe tener un tamaño de dibujo diferente?

Además, cómo/dónde en el Android Source Code la medida ancho/alto se utiliza para calcular el ancho/alto del dibujo? Intenté buscar en el View source code, pero no puedo entender cómo se usa el measuredWidth/Height para calcular el ancho/alto final. Tal vez tiene algo que ver con el relleno, pero no estoy seguro.

+0

Creo que estas medidas pueden ser diferentes en caso de que se agregue un desplazamiento a la vista. – Yury

+0

Quizás, pero desarrollé un ViewGroup personalizado, y esto está sucediendo en mi código. No me refiero al desplazamiento hasta el momento en que ocurre este comportamiento. Así que creo que debería haber algo más que scroll involucrado en esto. – lgfischer

+0

Confirmo que también desarrollé un ViewGroup personalizado para forzar una relación de aspecto determinada: forcé el ancho y la altura medidos (inferiores o iguales a los propuestos), pero como resultado no se modificaron el ancho y la altura reales (no los medidos). Sin relación con el desplazamiento. Realmente no puedo encontrar una manera de forzar el ancho y la altura real. – ARLabs

Respuesta

68

Como su nombre indica, elmedWidth/height se usa durante la medición de un nd fase de diseño.

Déjenme darles un ejemplo,

Se pide a un widget para medir la misma, el control dice que quiere ser 200 píxeles por 200 píxeles. Esto se mide Ancho/alto.

Durante la fase de disposición, es decir, en el método onLayout. El método puede usar el width/height 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 utilizar el método de MeasureWidth/height fuera on Layout.

para resumir.

  1. onMeasure -> establece measuredWidth/measuredHeight
  2. OnLayout -> establece la anchura/altura del widget.

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

+0

es decir, siempre debemos usar getWidth/getHeight para obtener la dimensión "real" de una Vista, ¿verdad? – suitianshi

+0

Sí, pero si está haciendo su propio diseño, entonces debe usar measuredWidth en lugar de ancho. –

+0

Entonces, ¿cuál es el propósito de establecer dimesiones dentro de Measure()? Quiero decir, el pase de disposición es el último, en el que establece las dimensiones finales de la vista, independientemente de las dimensiones medidas – edoardotognoni

Cuestiones relacionadas