Intereting Posts
MediaCodec дает ошибку трассировки storeMetaDataInBuffers Использование библиотеки поддержки Android 23.2 в приложении build.gradle crashes (XmlPullParserException: XmlPullParserException: недопустимый вектор ярлыка) Ошибка OutOfMemory только на устройствах Android 6.0.1 Переменные среды Linux для Linux Маржи макета для Android в процентах Android Studio: ошибка: выполнение не выполнено для задачи: app: dexDebug ' Закусочная с координаторомLayout отключить увольнение Как я могу проверить блокировку SIM-карты на уровне приложений Android Настройка цвета фона для SurfaceView в Android Как отобразить изображение, которое я только что взял с моей камеры в приложении для Android? Получить текущую активность из Application.Context – MonoAndroid Android – SeparatedListAdapter – Как получить точную позицию позиции на onClick? Как проверить, выпущен ли MediaPlayer ()? Аварийный сигнал срабатывает, если время увлажнителя, чем текущее системное время в android Как изменить цвет сфокусированного EditText при использовании «android: Theme.Holo.Light»?

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