Intereting Posts
Таблица лидеров Android не работает после публикации. RESULT_APP_MISCONFIGURED error Как я могу опубликовать на Twitter с помощью Intent Action_send? Эффект искажения Android, переопределенный выбранным состоянием Как увеличить выбранную высоту вкладки в виджетах вкладки? Множественная конфигурация окружения с помощью android xml config на Eclipse Android – как вызывать тост каждые 10 секунд, используя ScheduledExecutorService? MediaStore.Images.Thumbnails.getThumbnail возвращает неверный миниатюру вместо NULL Listview.getCheckedItemPositions () не возвращает правильный результат, когда элемент не установлен Чтение из текстового файла в Android Studio Java Ошибка: (29, 0) Плагин с id 'com.google.gms.google-services' не найден. Использование API Карт Google v2 Android обнаруживает экземпляр EditText и экземпляр TextView как тот же Как создать ярлык, который приводит к активности без запуска? "Java.lang.IllegalArgumentException: никакие конфиги не соответствуют configSpec" При открытии камеры Intent Как разместить радиальный градиентный фон

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

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

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

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

WidthMeasureSpec и heightMeasureSpec являются составными переменными. В то время как они просто простые старые, они фактически содержат две отдельные части данных.

Первой частью данных, хранящейся в этих переменных, является доступное пространство ( в пикселях ) для данного измерения.

Вы можете извлечь эти данные, используя этот удобный метод:

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