В чем разница между getWidth / Height () и getMeasuredWidth / Height () в Android SDK? - PullRequest
74 голосов
/ 28 декабря 2011

Документация Android сообщает , что для вида есть два размера: измеренные размеры и размеры чертежа . Измеренный размер - это размер, вычисленный в проходе измерения (метод onMeasure ), в то время как размеры чертежа являются фактическим размером на экране. В частности, в документации сказано, что:

Эти значения могут, но не обязательно, отличаться от измеренных ширины и высоты.

Итак, мой вопрос: что может сделать размер чертежа отличным от измеренного размера? Если метод onMeasure (int, int) учитывает требования макета (заданные как параметры widthMeasureSpec и heightMeasureSpec , как SDK может решить, что представление должно иметь другой размер рисунка?

Кроме того, как / где в Исходном коде Android измеренная ширина / высота используется для вычисления ширины / высоты рисунка? Я попытался заглянуть в исходный код View , но я не могу понять, каким образом измеренная ширина / высота используется для вычисления окончательной ширины / высоты. Может быть, это как-то связано с отступом, но я не уверен.

1 Ответ

83 голосов
/ 29 декабря 2011

Как следует из названия, измеренная ширина / высота используется во время фазы измерения и компоновки.

Позвольте мне привести пример,

Виджет просят измерить себя. Виджет говорит, что он хочет быть 200px на 200px.Это измеряется ширина / высота.

На этапе макета, т.е. в методе onLayout.Метод может использовать измеренную ширину / высоту своих дочерних элементов или назначить новую ширину / высоту, вызвав метод компоновки представления.

Допустим, метод onLayout вызывает childview.layout (0,0,150,150), теперь width /высота вида отличается от измеренной ширины / высоты.

Я бы посоветовал не использовать measureWidth / height вне метода onLayout.

для подведения итогов.

  1. onMeasure -> устанавливает Измеренная ширина / измеренная высота
  2. onLayout -> устанавливает ширину / высоту виджета.

дополнительно все
public void View.layout(int l, int t, int r, int b)
кажется местом, где происходит назначение позиции и размера.

...