Яка різниця між getWidth / Height () та getMeasuredWidth / Height () в Android SDK?


88

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

Ці значення можуть, але не повинні, відрізнятися від виміряних ширини та висоти.

Отже, моє запитання: що може зробити розмір креслення відмінним від вимірюваного? Якщо метод onMeasure (int, int) дотримується вимог до макета (задається як параметри widthMeasureSpec та heightMeasureSpec , як SDK може вирішити , що подання має мати інший розмір креслення?

Крім того, як / де у вихідному коді Android виміряна ширина / висота використовується для обчислення ширини / висоти креслення? Я намагався розглянути вихідний код View , але не можу зрозуміти, як виміряна Ширина / Висота використовується для обчислення остаточної ширини / висоти. Можливо, це пов’язано з підбиванням, але я не впевнений.


Я думаю, що ці заходи можуть бути різними у випадку, якщо до подання буде додано прокрутку.
Юрій

Можливо, але я розробив власну ViewGroup, і це відбувається в моєму коді. Я не маю справи зі прокруткою до моменту, коли така поведінка відбувається. Тож я думаю, що в цьому має бути задіяно більше, ніж прокрутка.
lgfischer

Я підтверджую, я також розробляю власну ViewGroup, щоб примусити задане співвідношення сторін: я змусив виміряти ширину та висоту (нижчу або рівну, ніж пропонувалося), але в результаті реальна ширина та висота не змінилися (не виміряні). Ніякого відношення до прокрутки. Я справді не можу знайти спосіб примусити реальну ширину та висоту.
ARLabs

Відповіді:


96

Як випливає з назви, вимірювана ширина / висота використовується на етапі вимірювання та компонування.

Дозвольте навести приклад,

Віджету пропонується виміряти себе. Віджет каже, що він хоче бути 200px на 200px. Це вимірюється шириною / висотою.

Під час фази макетування, тобто в методі onLayout. Метод може використовувати виміряну ширину / висоту своїх дочірніх об'єктів або призначити нову ширину / висоту, викликавши метод макетування подання.

скажімо, метод onLayout викликає childview.layout (0,0,150,150), тепер ширина / висота подання відрізняється від виміряної ширини / висоти.

Я б порадив не використовувати вимірювану Ширину / Висоту поза методом onLayout.

узагальнити .

  1. onMeasure -> встановлює вимірювану ширину / вимірювану висоту
  2. onLayout -> встановлює ширину / висоту віджета.

додатково,
public void View.layout(int l, int t, int r, int b)
здається, це місце, де відбувається призначення посади та розміру.


тобто ми завжди повинні використовувати getWidth / getHeight, щоб отримати "справжній" вимір вигляду, так?
suitianshi

1
Так, але якщо ви робите власну компоновку, то вам слід використовувати заміряну ширину заміряну ширину.
Пракаш Надар

Отже, яка мета встановлення розмірів усередині onMeasure ()? Я маю на увазі, пропуск макета є останнім, в якому ви встановлюєте кінцеві розміри виду, можливо незалежно від вимірюваних розмірів
edoardotognoni

@edoardotognoni, залежить від макета (LinearLayout, RelativeLayout або ваш власний макет), щоб надати правильний розмір і розташування подання.
Пракаш Надар

Гаразд, скажімо, в поданні говориться "Я хотів би мати ці розміри". У той час як на макеті написано "Ви будете мати ці розміри". Це право?
edoardotognoni
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.