Обычно при создании пользовательского макета с расширением View
или ViewGroup
необходимо переопределить protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
и protected void onLayout(boolean changed, int left, int top, int right, int bottom)
. Они вызываются во время процесса инфляции, чтобы получить информацию о размере и местоположении, связанную с представлением. Кроме того, впоследствии, если вы расширяете ViewGroup
, вы должны вызывать measure(int widthMeasureSpec, int heightMeasureSpec)
и layout(int l, int t, int r, int b)
для каждого дочернего представления, содержащегося в нем. (measure () вызывается в onMeasure (), а layout () вызывается в onLayout ()).
В любом случае, в onMeasure()
вы обычно делаете что-то подобное.
@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 ***
}
В onLayout()
вы получаете фактические пиксельные координаты вида, поэтому вы можете получить физический размер следующим образом:
@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;
}