Layout personalizado do Android

Ontem passei algum dia lutando com layouts para Android (... ou melhores layouts personalizados). Para fins gerais, os layouts prontos para uso que os andróides oferecem são mais que suficientes. Mas quando se trata de casos de uso mais complexos (tomemos o exemplo do carrossel com sobreposição de imagens colocadas em um caminho elíptico), percebi rapidamente a limitação e a complexidade das APIs do Android. Esta foi a minha abordagem:

Usar layouts prontos para uso não é uma opção (para muitos problemas incontroláveis de lidar), no entanto, a necessidade de objetos gráficos que podem ser adicionados a um contêiner (digamos ImageView, por exemplo) é necessária para executar traduções, rotações, etc ... através de animação incorporada.

O AbsoluteLayout parece o layout mais razoável disponível para esse fim. Permite adicionar objetos de visão derivados e escrever seu próprio algoritmo para posicioná-los. Mas ... está obsoleto. Isso é uma vergonha! Quem quer usar APIs obsoletas?

A próxima coisa mais razoável a se fazer é escrever seu próprio layout subclassificando o místico ViewGroup ... e é aqui que tudo se desfaz (pelo menos para mim). É complicado, enganoso e complicado fazê-lo tanto quanto escrever seu próprio layout personalizado para swing (na verdade, fiz isso anos atrás e lembro-me de ser mais simples).

Então (motivado pelo desespero) subclassificar uma View, substituindo o método onDraw e desenhando diretamente em um Canvas, parece a única solução direta (embora isso me lembre os dias de java2D ... longas horas gastas para atingir os 1% altos de seu projeto), mas você está desistindo das APIs de animação internas úteis que deseja aplicar aos gráficos desenhados na tela.

A conclusão é que, a menos que eu tenha perdido algo, a arquitetura android atual está um pouco longe do paradigma de programação oferecido por outras tecnologias de interface do usuário, como flash ou javafx (eu posso implementar facilmente o carrossel descrito acima em javafx e flash). O motivo é que, em javafx, por exemplo, o objeto Scene (comparável ao conceito View do Android) oferece, por padrão, um layout absoluto. Você pode aplicar outros layouts prontos para uso, se desejar. Mas para cenários em que um layout personalizado é necessário, você não precisa fazer nada.

Estou um pouco surpresa que essa opção não esteja disponível no Android, afinal é uma necessidade bastante comum que é abordada por outras tecnologias de interface do usuário. Ainda gosto de pensar que existe uma quinta opção no Android que não encontrei. Algum especialista lá fora, que poderia fornecer algumas informações sobre o assunto?

Obrigado.

questionAnswers(4)

yourAnswerToTheQuestion