Quase sempre, quando vou ministrar aula de Android, sempre tem alguém que pergunta: "Professor tem como definir o tamanho de um componente usando percentual?". Normalmente quem faz essa pergunta é algum desenvolvedor web, onde utilizar valores percentuais para elementos de UI é algo bem comum no front-end de uma aplicação.
Mas no caso do Android, a resposta era sempre não, mas podíamos resolver esse problema utilizando o LinearLayout e definir nas views filhas a propriedade android:layout_weight como mostrei nesse post aqui.
Mas finalmente o Google criou para nós, gerenciadores de layout que suportam medidas percentuais. São eles: PercentFrameLayout e PercentRelativeLayout.
Para utiliza-los, basta adicionar a seguinte dependência no build.gradle.
dependencies { ... compile 'com.android.support:percent:23.1.1' }
Depois é só utilizar no arquivo de layout.
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/centered_image" android:layout_width="0dp" android:layout_height="0dp" android:background="#FF0000" app:layout_heightPercent="@fraction/fifty_percent" app:layout_widthPercent="@fraction/fifty_percent"/> <TextView android:id="@+id/caption" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_below="@id/centered_image" android:background="#00FF00" android:text="Texto" app:layout_marginRightPercent="@fraction/twentyfive_percent" app:layout_marginLeftPercent="@fraction/twentyfive_percent" app:layout_widthPercent="50%"/> </android.support.percent.PercentRelativeLayout>
Perceba que para evitar problemas de compilação adicionamos a largura e altura do componente como 0dp, mas as propriedades que realmente definirão o tamanho do componente são app:layout_heightPercent e app:layout_widthPercent.
Estamos utilizando uma referência para @fraction ao invés do valor hard-coded. Desta forma defina esses valores, por exemplo, no res/values/dimens.xml.
<resources> ... <fraction name="twentyfive_percent">25%</fraction> <fraction name="fifty_percent">50%</fraction> </resources>Outro detalhe importante é que podemos definir margens utilizando valores percentuais, recurso que não conseguíamos no LinearLayout.
O resultado ficará como a seguir:
- https://developer.android.com/intl/pt-br/reference/android/support/percent/PercentRelativeLayout.html
- https://developer.android.com/intl/pt-br/reference/android/support/percent/PercentFrameLayout.html
4br4ç05,
nglauber
4 comentários:
Olá Glauder,
Excelente artigo, só fiquei com uma dúvida: além de evitar erros de compilação, definir o layout_width e layout_height como 0dp ajuda na performance correto?
Oi jonathanrz,
O que diz na documentação é que, se você quiser que o layout ocupe mais espaço que o especificado no percentual, você deve utilizar wrap_content. Então esses valores são utilizados sim durante o desenho da tela.
http://developer.android.com/reference/android/support/percent/PercentRelativeLayout.html
4br4ç05,
nglauber
Ótima notícia!!!
tem um PercentLinearLayout? =D
Oi Hugo,
Não precisa, pois você pode obter o mesmo resultado com o peso (layout_weight="0.5") ;)
4br4ç05,
nglauber
Postar um comentário