.NET Maui - AbsoluteLayout


  Neste artigo vou apresentar o layout AbsoluteLayout do .NET MAUI.

Se você esta chegando agora e não sabe o que é o .NET MAUI nem como usá-lo acompanhe o meu artigo :  Criando seu primeiro projeto  onde eu mostro como verificar e configurar o ambiente para criar sua primeira aplicação .NET MAUI.

Apresentando o AbsoluteLayout

As classes de Layout do .NET MAUI permitem organizar e agrupar controles de interface do usuário em seu aplicativo. Escolher uma classe de layout requer conhecimento de como o layout posiciona seus elementos filho e como o layout dimensiona seus elementos filho. Além disso, pode ser necessário aninhar layouts para criar o layout desejado.

Os principais layouts disponíveis no .NET MAUI são :

O AbsoluteLayout é um layout usado para posicionar e dimensionar filhos usando valores explícitos, incluindo valores absolutos e proporcionais.

A posição e o tamanho de um filho é definido pela configuração da propriedade anexada AbsoluteLayout.LayoutBounds de cada filho

A posição e o tamanho de um filho pode usar valores proporcionais no intervalo de 0 a 1 definindo a propriedade AbsoluteLayout.LayoutFlags.

Este layout deve ser considerado como um layout de finalidade especial a ser usado somente quando você pode impor um tamanho aos filhos ou quando o tamanho do elemento não afeta o posicionamento de outros filhos.

Principais Propriedades

A classe AbsoluteLayout define duas propriedades usadas para definir a posição, altura e largura de um filho  :

1- AbsoluteLayout.LayoutBounds

Pode ser definida usando dois formatos, independentemente de valores absolutos ou proporcionais serem usados:

x, y  -  Indicam a posição do canto superior esquerdo do filho em relação ao pai. O filho se dimensiona

x, y, largura, altura - Os valores x e y indicam a posição do canto superior esquerdo do filho em relação ao pai, enquanto os valores de largura e altura indicam o tamanho do filho.

Para especificar que um filho se dimensiona horizontalmente ou verticalmente, ou ambos, basta definir os valores de largura e/ou altura para a AbsoluteLayout.AutoSize.

O valor padrão desta propriedade é : (0,0,AutoSize,AutoSize)

Nota: Proporcional - indica uma relação entre um layout e uma visualização e Absoluto -  Define os valores com posição fixa. Obtém a posição, independentemente de caber na tela ou não.

Na figura a seguir temos um exemplo de LayouBounds definindo os valores de X e Y para indicar a posição
(canto superior esquerdo do filho em relação ao pai) e da largura e altura para indicar o tamanho do filho

A sintaxe usada no código XAML usa o nome do Layout AbsoluteLayout ponto e o nome da propriedade
seguido dos valores para x , y , width e height :

No exemplo a seguir exemplo estamos usando AbsoluteLayout que contem um BoxView como filho e estamos definindo os valores da posição (x,y) e da largura e altura do BoxView com cor Azul usando LayoutBounds.(como não indicamos o valor de LayoutFlags os valores são tratados como absolutos)

<AbsoluteLayout>
    <BoxView Color="Blue"  AbsoluteLayout.LayoutBounds="100, 50, 150, 200" />
</AbsoluteLayout>

2- AbsoluteLayout.LayoutFlags

Esta propriedade permite indicar que a posição dos limites do layout e os valores de tamanho para um filho são proporcionais ao tamanho do AbsoluteLayout. Os valores possíveis são:

Criando o projeto .NET MAUI

A seguir vou mostrar alguns exemplos usando FlexLayout. Para isso vamos criar um novo projeto no VS 2022 usando o template .NET MAUI App chamado AppAbsoluteLayout :

A seguir vamos criar uma pasta Pages no projeto e nesta pasta vamos criar uma Content Page usando a opção .NET MAUI e selecionando .NET MAUI ContentPage (XAML) e informando o nome AbsoluteLayoutDemo1.xaml :

A seguir altere o código do arquivo App.xaml.cs definindo a MainPage conforme abaixo:

namespace AppAbsoluteLayout;
public
partial class App : Application
{
 
public App()
  {
    InitializeComponent();
    MainPage =
new NavigationPage(new AbsoluteLayoutDemo1());
  }
}

Vamos iniciar com um exemplo onde temos um layout definido com um BoxView com cor vermelha onde estamos usando o valor XProportional para LayoutFlags que vai considerar os valores para x como proporcionais e os demais como absolutos para LayoutBounds:

<AbsoluteLayout>
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="XProportional"
          
AbsoluteLayout.LayoutBounds="0, 50, 30, 30" />
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="XProportional"
          
AbsoluteLayout.LayoutBounds="0.6, 100, 30, 30" />
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="XProportional"
          
AbsoluteLayout.LayoutBounds="1, 150, 30, 30" />
</
AbsoluteLayout>

No primeiro BoxView, LayoutBounds é definido como 0, 50, 30, 30, o que significa que ele está posicionado no canto superior esquerdo da tela (0% da largura e 50 pixels da borda superior) e tem 30 por 30 pixels de tamanho.

No segundo BoxView, LayoutBounds é definido como 0.6, 100, 30, 30, o que significa que ele está posicionado a 60% da largura da tela e 100 pixels da borda superior, e tem 30 por 30 pixels de tamanho.

No terceiro BoxView, LayoutBounds é definido como 1, 150, 30, 30, o que significa que ele está posicionado na borda direita da tela (100% da largura) e 150 pixels da borda superior, e tem 30 por 30 pixels de tamanho.

Assim ao definir o LayoutFlags como XProportional, a posição horizontal da BoxView é proporcional à largura da tela, mas a posição vertical é definida absolutamente.

Usando o valor YProportional a posição vertical da BoxView é proporcional à largura da tela mas a posição horizontal e absoluta:

<AbsoluteLayout>
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="YProportional"
        
AbsoluteLayout.LayoutBounds="10, 0, 30, 30" />
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="YProportional"
        
AbsoluteLayout.LayoutBounds="100, 0.6, 30, 30" />
   <
BoxView Color="Red" AbsoluteLayout.LayoutFlags="YProportional"
        
AbsoluteLayout.LayoutBounds="200, 1, 30, 30" />
</
AbsoluteLayout>

Vejamos agora outro exemplo onde vamos usar cinco BoxView cada uma com um cor, onde definimos o valor da enumeração para LayoutFlags como PositionProportional.  Agora os valores de x e y são tratados como proporcionais e a largura e altura como absolutos para os valores de LayoutBounds :

<AbsoluteLayout>
  <
BoxView Color="Black"
   
AbsoluteLayout.LayoutBounds=".5,.5,100,100"
   
AbsoluteLayout.LayoutFlags="PositionProportional" />
  <
BoxView Color="Yellow"
   
AbsoluteLayout.LayoutBounds="1,.5,25,100"
   
AbsoluteLayout.LayoutFlags="PositionProportional" />
  <
BoxView Color="Red"
   
AbsoluteLayout.LayoutBounds="0,.5,25,100"
   
AbsoluteLayout.LayoutFlags="PositionProportional" />
  <
BoxView Color="Blue"
   
AbsoluteLayout.LayoutBounds=".5,0,100,25"
   
AbsoluteLayout.LayoutFlags="PositionProportional" />
  <
BoxView Color="Green"
    
AbsoluteLayout.LayoutBounds=".5,1,100,25"
   
AbsoluteLayout.LayoutFlags="PositionProportional" />
</
AbsoluteLayout>



Neste outro exemplo usamos o AbsoluteLayout para posicionar um botão no canto superior direito de uma página:

<AbsoluteLayout BackgroundColor="LightGray">
   <
Button Text="Clique-me!" FontSize="Large"
      
AbsoluteLayout.LayoutBounds="0.9, 0.1, 150, 50"
      
AbsoluteLayout.LayoutFlags="PositionProportional"/>
</
AbsoluteLayout>

Ao usar PositionProportional indicamos que x e y são tratados como proporcionais e os valores da largura e altura são tratados como absolutos.  Neste exemplo, a propriedade LayoutBounds do botão define a posição e o tamanho do botão no layout.

Os valores "0.9" e "0.1" significam que o botão deve ser posicionado a 90% da largura da tela e 10% da altura da tela a partir do canto superior esquerdo.

Os valores "100" e "50" significam que o botão deve ter uma largura de 100 unidades e uma altura de 50 unidades.

A propriedade LayoutFlags define como o AbsoluteLayout deve interpretar os valores de LayoutBounds.

Neste caso, estamos usando PositionProportional, o que significa que os valores de x e y de LayoutBounds são proporcionais à largura e altura da tela e os valores da largura e altura são tratados como absolutos

Vamos incluir mais dois botões um abaixo do outro, onde o segundo vai estar mais perto da base da página. Para isso basta alterar o valor de y :

<AbsoluteLayout BackgroundColor="LightGray">
  
<Button Text="Clique-me!" FontSize="Large"
     
AbsoluteLayout.LayoutBounds="0.9, 0.1, 150, 50"
     
AbsoluteLayout.LayoutFlags="PositionProportional"/>
   <
Button Text="Clique em mim!" FontSize="Large"
      
AbsoluteLayout.LayoutBounds="0.9, 0.3, 150, 50"
      
AbsoluteLayout.LayoutFlags="PositionProportional"/>
    <
Button Text="Clique em mim!"  FontSize="Large"
      
AbsoluteLayout.LayoutBounds="0.9, 0.9, 150, 50"
      
AbsoluteLayout.LayoutFlags="PositionProportional"/>
</AbsoluteLayout>



Agora veremos um exemplo mostrando o uso do AbsoluteLayout com 3 filhos mostrando o AbsoluteLayout é capaz de posicionar os filhos para que eles se sobreponham usando usando as propriedades do AbsoluteLayout.

<AbsoluteLayout BackgroundColor="LightGray">
   <
BoxView Color="Red"
     
AbsoluteLayout.LayoutBounds="0.1, 0.1, 0.3, 0.3"
     
AbsoluteLayout.LayoutFlags="All"/>
   <
BoxView Color="Green"
     
AbsoluteLayout.LayoutBounds="0.4, 0.4, 0.4, 0.4"
     
AbsoluteLayout.LayoutFlags="All"/>
   <
BoxView Color="Blue"
    
AbsoluteLayout.LayoutBounds="0.6, 0.6, 100, 100"
    
AbsoluteLayout.LayoutFlags="PositionProportional"/>
</
AbsoluteLayout>

Neste exemplo, estamos adicionando 3 BoxView ao AbsoluteLayout, cada uma com uma cor diferente. A primeira BoxView é posicionada no canto superior esquerdo da tela, ocupando 30% da largura e 30% da altura da tela.

A segunda BoxView é posicionada no centro da tela, ocupando 40% da largura e 40% da altura da tela.

A terceira BoxView é posicionada a 60% da largura e 60% da altura da tela, e tem um tamanho absoluto de 100 por 100 unidades.

Observe que em cada BoxView definimos as propriedades LayoutBounds e LayoutFlags :

1- LayoutBounds define a posição e tamanho da BoxView no layout
2- LayoutFlags define como a BoxView deve ser posicionada e redimensionada em relação à sua posição e tamanho.


Na primeira BoxView, definimos LayoutFlags como All, o que significa que a posição e o tamanho da BoxView são proporcionais à largura e altura da tela.

Na segunda BoxView, definimos LayoutFlags como All novamente para tornar a posição e tamanho da BoxView proporcionais.

Na terceira BoxView, definimos LayoutFlags como PositionProportional para tornar a posição (x,y) da BoxView proporcional à tela, mas o tamanho (width e height) é definido com valores absolutos.

Para concluir temos uma variação do exemplo anterior onde agora estamos usando o valor WidthProportional para o BoxView Azul:

<AbsoluteLayout BackgroundColor="Cyan">
   <
BoxView Color="Red"
    
 AbsoluteLayout.LayoutBounds="0.1, 0.1, 0.3, 0.3"
    
 AbsoluteLayout.LayoutFlags="All"/>
    <
BoxView Color="Green"
     
AbsoluteLayout.LayoutBounds="0.5, 0.5, 150, 150"
     
AbsoluteLayout.LayoutFlags="PositionProportional"/>
    <
BoxView Color="Blue"
     
AbsoluteLayout.LayoutBounds="200, 100, 0.5, 100"
     
AbsoluteLayout.LayoutFlags="WidthProportional"/>
</
AbsoluteLayout>

A primeira BoxView é posicionada no canto superior esquerdo da tela, ocupando 30% da largura e 30% da altura da tela.

A segunda BoxView é posicionada a 50% da largura e 50% da altura da tela, e tem um tamanho absoluto de 150 por 150 unidades.

A terceira BoxView é posicionada a 80% da largura da tela e 10% da altura da tela, e tem uma largura proporcional à largura da tela.

Observe que cada BoxView tem suas propriedades LayoutBounds e LayoutFlags definidas para controlar sua posição e tamanho no layout.

Na primeira BoxView, definimos LayoutFlags como All, o que significa que a posição e o tamanho da BoxView são proporcionais à largura e altura da tela.

Na segunda BoxView, definimos LayoutFlags como PositionProportional para tornar a posição e tamanho da BoxView proporcional à largura e altura da tela.

Na terceira BoxView, definimos LayoutFlags como WidthProportional para tornar a largura da BoxView proporcional à largura da tela, enquanto a altura é definida absolutamente.

Creio que com isso você já percebeu como usar este Layout.

E estamos conversados...

Disse Jesus: "Olhai para as aves do céu, que nem semeiam, nem segam, nem ajuntam em celeiros; e vosso Pai celestial as alimenta. Não tendes vós muito mais valor do que elas?"
Matheus 6:26

Referências:


José Carlos Macoratti