Habituellement, lors de la création d'une mise en page personnalisée s'étendant View
ou ViewGroup
, vous devez remplacer protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
et protected void onLayout(boolean changed, int left, int top, int right, int bottom)
. Ceux-ci sont appelés pendant le processus d'inflation afin d'obtenir les informations de taille et de localisation liées à la vue. En outre, par la suite, si vous étendez ViewGroup
vous devez appeler measure(int widthMeasureSpec, int heightMeasureSpec)
et layout(int l, int t, int r, int b)
sur chaque vue enfant contenue dans. (measure() est appelée dans onMeasure() et layout() est appelée dans onLayout()).
Quoi qu'il en soit, dans onMeasure()
, vous faites généralement quelque chose comme ça.
@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()
vous obtenez les coordonnées de pixels réels de la vue, afin que vous puissiez obtenir la taille physique comme ceci:
@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;
}
Je l'utilise depuis un certain temps pour ajuster les textures en textview, je n'ai jamais su que cela puisse aussi être utilisé pour ViewGroup. Merci pour l'aide! – PravinCG