Si desea obtener el ancho y la altura antes de que su actividad ha añadido a su jerarquía de vistas, se mide y se presentarán a cabo tendrá que llamar measure()
en el View
a sí mismo antes de llamar getMeasuredWidth()
o getMeasuredHeight()
.
Como el ancho y la altura medidos se configuran después de haber llamado a la medida (que a su vez llama a onMeasure()
), devolverán 0 antes de este punto. Deberá suministrar MeasureSpec
s al measure(..)
que variará según sus necesidades.
Los MeasureSpecs que permiten a los niños a imponer limitaciones a sí mismos se ven como
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);
punto importante. (se ha cambiado en la nueva API)
El ancho pasado en el anterior puede ser o bien px explícita o
ViewGroup.LayoutParams.WRAP_CONTENT
o
ViewGroup.LayoutParams.FILL_PARENT.
También debe notarse cuando su vista se mide en la jerarquía de destino real del MeasureSpec que será pasado a measure()
se configurará según la lógica de diseño ViewGroups
. Se puede invocar más de una vez si los primeros vals de medida no son válidos cuando se consideran en el contexto de este padre viewGroup/its own layout constraits/the constraints de cualquier hermano child-views. Sin esperar que viewGroup
llame al measure()
antes de implementar cualquier lógica dependiente del tamaño medido, sería difícil (dependiendo de la situación) obtener el measuredWidth & height
final de la solución anterior, pero en todas las instancias he utilizado la técnica anterior que tiene se ajustan al propósito, pero han sido relativamente simples. Si realmente necesita medir en contexto, probablemente debería hacerlo después de que onLayout()
haya regresado y explícitamente establecer cualquier cambio, luego requestLayout()
nuevamente.
primero tiene que llamar a measure() - vea mi respuesta – Dori