Por lo general, al crear un diseño personalizado que se extiende View
o ViewGroup
, usted tiene que anular protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
y protected void onLayout(boolean changed, int left, int top, int right, int bottom)
. Estos se llaman durante el proceso de inflación para obtener la información de tamaño y ubicación relacionada con la vista. También, posteriormente, si se está extendiendo ViewGroup
has de ponerle measure(int widthMeasureSpec, int heightMeasureSpec)
y layout(int l, int t, int r, int b)
en cada punto de vista del niño que contiene. (se llama a measure() en Measure() y layout() se invoca onLayout()).
De todos modos, en onMeasure()
, por lo general, hacer algo como esto.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// Gather this view's specs that were passed to it
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int chosenWidth = DEFAULT_WIDTH;
int chosenHeight = DEFAULT_HEIGHT;
if(widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY)
chosenWidth = widthSize;
if(heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.EXACTLY)
chosenHeight = heightSize;
setMeasuredDimension(chosenWidth, chosenHeight);
*** NOW YOU KNOW THE DIMENSIONS OF THE LAYOUT ***
}
En onLayout()
que obtener las coordenadas en píxeles reales de la vista, para que pueda obtener el tamaño físico de este modo:
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
// Android coordinate system starts from the top-left
int width = right - left;
int height = bottom - top;
}
He estado usando esto por algún tiempo para ajustar el tamaño de texto en la vista de texto, nunca supe que esto también se puede usar para ViewGroup. ¡Gracias por la ayuda! – PravinCG