Um RelativeLayout é mais caro do que um LinearLayout?

114

Sempre usei RelativeLayout sempre que precisava de um contêiner View, por causa de sua flexibilidade, mesmo se eu só quisesse exibir algo realmente simples.

Posso fazer isso ou devo tentar usar um LinearLayout quando puder, do ponto de vista de desempenho / boas práticas?

Obrigado!

Nbarraille
fonte

Respostas:

149

Em uma palestra no Google I / O 2013 (Escrevendo visualizações personalizadas para Android), Romain Guy esclareceu o mal-entendido que fez com que todos começassem a usar RelativeLayouts para tudo. Um RelativeLayout sempre precisa fazer duas passagens de medição. No geral, é insignificante, desde que sua hierarquia de visualização seja simples. Mas se sua hierarquia for complexa, fazer uma passagem de medida extra pode ser bastante caro. Além disso, se você aninhar RelativeLayouts, obterá um algoritmo de medição exponencial.

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

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

Pierre-Antoine LaFayette
fonte
8
Eu sei que este é um post antigo, mas o que você consideraria ser a solução menos custosa ao escolher entre um único relativelayout e 2-3 layouts lineares?
Langkiller,
5
A ConstraintLayout :)
moyheen
52

A menos que você esteja exibindo muitas visualizações (por exemplo, em uma ListView), o desempenho de escolher entre LinearLayout ou RelativeLayout é insignificante. Escolha o que for mais conveniente para o trabalho e se preocupe com o desempenho apenas quando for necessário.

E aqui está o que a documentação oficial sobre como criar layouts eficientes diz sobre o desempenho de RelativeLayout e LinearLayout:

Manter os recursos básicos infelizmente não é a maneira mais eficiente de criar interfaces de usuário. Um exemplo comum é o abuso de LinearLayout, que leva a uma proliferação de visualizações na hierarquia de visualizações. Cada visualização - ou pior, cada gerenciador de layout - que você adiciona ao seu aplicativo tem um custo: inicialização, layout e desenho ficam mais lentos. A passagem de layout pode ser especialmente cara quando você aninha vários LinearLayout que usam o parâmetro de peso, o que requer que o filho seja medido duas vezes.

Mentira ryan
fonte
3
a justificativa para isso ser insignificante? Eu achei isso que afirma o valor relativo do layout
max4ever
Apenas evite adicionar recipientes internos.
Luis Pena
2

Relativelayout é mais eficaz do que Linearlayout.

A partir daqui :

É um equívoco comum que usar as estruturas básicas de layout leva aos layouts mais eficientes. No entanto, cada widget e layout que você adiciona ao seu aplicativo requer inicialização, layout e desenho. Por exemplo, o uso de instâncias aninhadas de LinearLayout pode levar a uma hierarquia de visualização excessivamente profunda. Além disso, aninhar várias instâncias de LinearLayout que usam o parâmetro layout_weight pode ser especialmente caro, pois cada filho precisa ser medido duas vezes. Isso é particularmente importante quando o layout é inflado repetidamente, como quando usado em um ListView ou GridView.

Nicholas Liu
fonte
2
@phreakhead Você está certo ao dizer que não existe uma solução "correta" única. É por isso que a solução "correta" quase sempre é esquecer totalmente o desempenho e fazer o que for mais fácil de escrever e ler.
Kevin Krumwiede
3
essa citação não apóia sua declaração, o que só é verdade em uma situação
Flo We
A verdade é que projete seu layout sempre tentando minimizar o número de níveis de hierarquia (layout dentro do layout dentro do layout) e verifique a ferramenta de visualização de hierarquia para encontrar possíveis problemas.
Alexandre Haroldo da Rocha
1

ATUALIZAÇÃO DE 2018: Na versão N do Android, a ConstraintLayoutclasse fornece funcionalidade semelhante RelativeLayout, mas a um custo significativamente menor. É um gerenciador de layout muito poderoso e deve ser usado sempre que for necessário construir uma GUI complexa.

akelec
fonte
desde a última versão, tornou-se muito lento
Dragos Rachieru
Depende de como é usado. Você deve evitar o posicionamento absoluto e usar restrições.
akelec
-25

Podes tentar

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

Você vai descobrir que existem muitas coisas diferentes, se suas páginas carregarem algumas imagens da internet. Nesse caso, o LinearLayout é 100% melhor do que o RelativeLayout de todos os tempos.

TeeTracker
fonte