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


114

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

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

Спасибо!

Ответы:


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

-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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.