Usually when creating a custom layout extending View
or ViewGroup
, you have to override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
and protected void onLayout(boolean changed, int left, int top, int right, int bottom)
. These are called during the process of inflation in order to obtain the size and location information related to the view. Also, subsequently, if you are extending ViewGroup
you are to call measure(int widthMeasureSpec, int heightMeasureSpec)
and layout(int l, int t, int r, int b)
on every child view contained within. (measure() is called in onMeasure() and layout() is called in onLayout()).
Anyway, in onMeasure()
, you generally do something like this.
@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 ***
}
In onLayout()
you get the actual pixel coordinates of the View, so you can get the physical size like so:
@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;
}