Подтвердить что ты не робот

Что такое widthMeasureSpec и heightMeasureSpec в пользовательских представлениях Android?

Я видел много примеров создания пользовательских представлений и макетов в android. Из того, что я узнал от них, является то, что эта мера (как сказано на сайте разработчика Android) - это onMeasure(), которая имеет параметры widthMeasureSpec и heightMeasureSpec.

  • Каково фактическое значение этих параметров?
  • Каковы их начальные значения?
  • С какими значениями вызывается, если пользовательское представление, которое я создаю, является родительским представлением для моей активности?

Я действительно очень смущен этими вопросами.

4b9b3361

Ответ 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, тем самым передавая немного меньшую область своим детям.