RelativeLayout дороже, чем LinearLayout?

114

Я всегда использовал RelativeLayout каждый раз, когда мне нужен был контейнер View, из-за его гибкости, даже если я просто хотел отобразить что-то действительно простое.

Можно ли это сделать, или мне следует попробовать использовать LinearLayout, когда это возможно, с точки зрения производительности / хороших практик?

Спасибо!

nbarraille
источник

Ответы:

149

В своем выступлении на Google I / O 2013 (Написание пользовательских представлений для Android) Ромен Гай разъяснил недоразумение, которое заставило всех начать использовать RelativeLayouts для всего. RelativeLayout всегда должен выполнять два прохода измерения. В целом это незначительно, если ваша иерархия представлений проста. Но если ваша иерархия сложна, выполнение дополнительного прохода измерения может оказаться довольно дорогостоящим. Кроме того, если вы вложите RelativeLayouts, вы получите алгоритм экспоненциального измерения.

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=1m41s

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=38m04s

Пьер-Антуан ЛаФайет
источник
8
Я знаю, что это старый пост, но что вы считаете наименее затратным решением при выборе между одним относительным макетом и 2-3 линейными макетами?
Лангкиллер
5
A ConstraintLayout :)
moyheen
52

Если вы не размещаете множество представлений (например, в ListView), производительность выбора между LinearLayout или RelativeLayout незначительна. Выберите то, что наиболее удобно для работы, и беспокойтесь о производительности только тогда, когда вам нужно.

А вот что в официальных документах по созданию эффективных макетов говорится о производительности RelativeLayout и LinearLayout:

К сожалению, использование основных функций - не самый эффективный способ создания пользовательских интерфейсов. Типичным примером является злоупотребление LinearLayout, которое приводит к увеличению количества представлений в иерархии представлений. Каждое представление - или, что еще хуже, каждый менеджер компоновки - которые вы добавляете в свое приложение, имеет свою цену: инициализация, компоновка и рисование становятся медленнее. Проход макета может быть особенно дорогостоящим, если вы вкладываете несколько LinearLayout, которые используют параметр веса, который требует, чтобы дочерний элемент измерялся дважды.

Ли Райан
источник
3
оправдание тому, что это ничтожно мало? Я нашел это, в котором указано, что relativeLayout стоит дороже, как я и подозревал bitbucket.org/spencerelliott/mercury/issue/1/…
max4ever
Просто избегайте добавления внутренних контейнеров.
Луис Пена
2

Relativelayout более эффективен, чем Linearlayout.

От сюда :

Распространенное заблуждение, что использование базовых структур макета приводит к наиболее эффективным макетам. Однако каждый виджет и макет, который вы добавляете в свое приложение, требуют инициализации, макета и рисования. Например, использование вложенных экземпляров LinearLayout может привести к чрезмерно глубокой иерархии представлений. Кроме того, вложение нескольких экземпляров LinearLayout, использующих параметр layout_weight, может быть особенно затратным, поскольку каждый дочерний элемент необходимо измерять дважды. Это особенно важно, когда макет многократно раздувается, например, при использовании в ListView или GridView.

Николас Лю
источник
2
@phreakhead Вы правы, что не существует единственного "правильного" решения. Вот почему «правильное» решение почти всегда - полностью забыть о производительности и делать то, что легче всего писать и читать.
Кевин Крамвиде
3
эта цитата не подтверждает ваше утверждение, что верно только в одной ситуации
Flo We
На самом деле, проектируйте свой макет, всегда стараясь минимизировать количество уровней иерархии (макет внутри макета внутри макета) и проверяйте инструмент просмотра иерархии, чтобы найти потенциальные проблемы.
Александр Гарольдо да Роша,
1

ОБНОВЛЕНИЕ 2018: В версии Android N ConstraintLayoutкласс предоставляет аналогичные функции RelativeLayout, но по значительно более низкой цене. Это очень мощный менеджер компоновки, и его следует использовать всякий раз, когда необходимо создать сложный графический интерфейс.

akelec
источник
начиная с последней версии, он стал очень-очень медленным
Драгош Рашиеру
Это зависит от того, как его используют. Вам следует избегать абсолютного позиционирования и использовать ограничения.
akelec
-25

Можешь попробовать

<LinearLayout>
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator/>
       <TextView/> <!--Show some info about page-->
</LinearLayout>

<RelativeLayout>           
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator below="id of ViewPager"/>
       <TextView below="id of ViewPagerIndicator"/> <!--Show some info about page-->
</RelativeLayout>

Вы обнаружите, что есть много разных, если ваши страницы загружают изображения из Интернета. В этом случае LinearLayout на 100% лучше, чем RelativeLayout.

TeeTracker
источник