Ответ 1
widthMeasureSpec и heightMeasureSpec являются составными переменными. В то время как они являются просто старыми ints, они фактически содержат две отдельные части данных.
Первой частью данных, хранящейся в этих переменных, является доступное пространство (в пикселях) для данного измерения.
Вы можете извлечь эти данные с помощью этого удобного метода:
int widthPixels = View.MeasureSpec.getSize( widthMeasureSpec );
Вторая часть данных - это режим измерения, она хранится в битах более высокого порядка для int и является одним из следующих возможных значений:
View.MeasureSpec.UNSPECIFIED
View.MeasureSpec.AT_MOST
View.MeasureSpec.EXACTLY
Вы можете извлечь значение с помощью этого удобного метода:
int widthMode = View.MeasureSpec.getMode( widthMeasureSpec );
Вы можете сделать некоторую логику, изменить одну или обе из них, а затем создать новый метод meassureSpec с использованием последнего метода удобства:
int newWidthSpec = View.MeasureSpec.makeMeasureSpec( widthPixels, widthMode );
И передайте это своим детям, обычно, вызывая super.onMeasure( widthMeasureSpec, heightMeasureSpec );
В onMeasure()
шаблон MeasureSpec служит для передачи в максимально допустимом пространстве вашего представления и его детям разрешено занять. Он также использует режим spec как способ размещения дополнительных ограничений для дочерних представлений, информируя их о том, как им разрешено использовать доступное пространство.
Хорошим примером того, как это используется, является Padding. ViewGroups берут доступную ширину и высоту и вычитают их отступы, а затем создают новый meassureSpec, тем самым передавая немного меньшую область своим детям.