Android View: Prólogo

Lucas
Android Dev BR
Published in
6 min readAug 1, 2019

Uma breve introdução sobre o principal componente de UI do Android.

Esse é o ínicio de uma série de artigos com o objetivo de disseminar o conhecimento a respeito do principal elemento de UI do Android: a View.

Ao final dessa série você estará apto a criar componentes customizados sem depender de uma biblioteca de terceiros, e também terá uma boa visão de como o componente base do android funciona.

View… o que é isso? 🤔

É o componente base de construção de elementos visuais a nível de aplicação.

Quando comecei a desenvolver para Android, a minha visão sobre View era bem limitada, eu não entendia ou pelo menos não buscava entender a real utilidade desse componente e como ele estava presente em quase tudo o que eu fazia, mesmo que indiretamente.

A título de informação, esse componente tem mais de 30 mil linhas de código… 🏃‍♂

Principais características

  • Está presente em uma camada (android.view) mais inferior que widgets (android.widget) e activities ou fragments (android.app)
  • Possui um ciclo de vida próprio que não está conectado com o ciclo de vida de uma Activity ou Fragment.

Essa segunda característica significa que ele não está fortemente ligado à um Activity (ou Fragment) assim como um Fragment está ligado à uma Activity.

Presença 😎

Sem exagero nenhum ela é o One Above all do Android UIniverse.

Representação simples da hierarquia de views presente hoje no Android

Como podemos ver na imagem acima, ela está presente em todos os componentes do Android, direta ou indiretamente. Sim, o muito famoso ViewGroup também é uma sub-classe direta dela.

A respeito do ViewGroup, não falaremos muito dele nessa série, mas saiba que ele é bastante utilizado em Containers ou Layouts como: RelativeLayout, LinearLayout, FrameLayout e ConstraintLayout, pois sua função é fazer uma agrupagem de Views.

A pilha do Android… 🔋

Representação em pilha da arquitetura da plataforma Android

A plataforma Android tem toda uma pilha bem definida e eu recomendo bastante que você leia mais sobre ela nessa página: arquitetura da plataforma.

O conteúdo da página é bem interessante e ela explica cada parte dessa pilha e como elas estão presentes na plataforma. O mais interessante pra gente, no momento, é a segunda camada (de cima para baixo), que é o Android Framework.

A imagem é muito interessante por causa da descrição que ela exibe para cada camada. A segunda, contém a seguinte mensagem:

Managers (Activity, Notification, Resource, …) — View System

Que mostra que o view system do Android, que incorpora os pacotes widgets e view, está separado do managers, que contém Activities e Fragments.

Mas o que isso realmente quer dizer? 😡

Que o Framework também está dividido em sub camadas, e elas estão organizadas de um modo em que a mais profunda não possui uma dependência com uma mais externa. Um exemplo disso é o seguinte:

As três camadas acimas estão em nível de profundidade. A última (android.view) não realiza uma comunicação com a primeira (android.app) ou com a segunda (android.widget). Mas a segunda (android.widget) utiliza bastante da última camada, afinal é nessa camada onde estão presentes os diversos componentes de UI que nós utilizamos hoje: TextView, Buttons, RelativeLayout, Spinner.

“[…] Do modo como o Android (Framework) está dividido hoje, onde cada camada está no topo de uma outra, você pode, por exemplo, se livrar da camada android.widget e só utilizar a android.view e tudo vai funcionar.” — Romain G.

O interessante da frase acima dita pelo Romain Guy serve para entendermos que para construirmos nossos aplicativos nós não dependemos do UI Toolkit (Widgets + Material Components), nós podemos simplesmente utilizar apenas a camada android.view, se caso quisermos fazer isso — ou se formos loucos o suficiente.

Indo direto ao ponto. 🚍

Hoje no Android nós temos uma série de componentes de UI que estão presente na camada android.widget, e são eles que nós utilizamos para compor nossas telas.

A real é que, em algum momento, você vai precisar utilizar um componente que não está presente no Framework ou nos componentes do Material Design.

E é aí que entram dois conceitos bem legais: Custom e Compound Views.

Custom Views
A definição para esse tipo é que eles são criados a partir do componente base (View) e definem um comportamento próprio.

Exemplo: TextView é uma Custom View, mas o Button não.

Compound Views
São componentes que herdam de outros componentes e utilizam comportamentos padrões definidos por eles.

Exemplo: O Button é uma Compound View, pois ele utiliza a TextView como base para o seu comportamento relacionados a texting.

Exercite: vá ao Framework do Android e tente dizer quais componentes são Custom e quais são Compounds.

Ainda sobre Custom Views… 🛂

Ao longo dessa série nós veremos mais sobre Custom Views e iremos criar algumas, mas antes de continuarmos, vamos abordar algumas vantagens e desvantagens que estão presentes na criação de Custom Views.

  • Pode ser doloroso ou demorado se você for iniciante ou não conhecer muito bem o view system.

Eu gosto de acreditar que se queremos crescer, a gente precisa apanhar um pouco, e Custom Views baterão em nós, no entanto, no fim, será prazeroso conseguir criar nossas próprias custom views sem depender de terceiros.

  • Temos liberdade de criação.

Essa é a principal vantagem de criar uma Custom View: temos independência e podemos criar o que quisermos, mas precisamos nos preocupar com algumas coisas (veremos mais sobre isso nos próximos artigos 🕵️‍♀️).

  • implementation 'fulano:componente:ftw' é mais rápido… 🤷‍♀️

É verdade, é bem mais rápido utilizar o componente que alguma pessoa adorável criou para o bem da comunidade. Mas você precisa lidar com os seguintes problemas, licenças e o principal: você está criando uma dependência externa e isso é ruim. E se você precisar de um comportamento que o componente não possui? E se o autor da biblioteca simplesmente desistir de atualizar ela?

Outro problema que muita gente deve ter: gráficos! O android não possui um componente padrão para gráficos e isso é chato! Desenhar gráficos é algo chato e então cedemos para uma biblioteca de terceiro.

Mas isso também tem um problema: a tal biblioteca possui uma quantidade enorme de gráficos, mas você só vai usar um tipo… será que você não está importando código desnecessário? 😱

  • Podemos criar um componente customizado apenas utilizando os já existente da plataforma.

Sim, conseguimos, por exemplo, criar um indicador de páginas (aquele redondinho) apenas criando ImageViews que possui dois estados: selecionado e não selecionado.

O primeiro representa uma bolinha com uma cor ativa e mostra ao usuário a página atual que ele está visualizando no ViewPager, o segundo são as outras páginas inativas.

Ou seja, para 3 páginas no ViewPager eu tenho ‘bolinhas’ e a página atual terá uma bolinha com alguma cor ou tamanho diferente. E olha só, basta jogar essas 3 ImageViews dentro de um LinearLayout com orientação horizontal e…. feito!

Custom View para representar a página selecionada em um ViewPager, por exemplo

Eu já fiz isso… mas diga-me, será mesmo que é performático usar uma quantidade dinâmica de ImageViews para isso? A resposta é não, essa abordagem é provavelmente a pior opção.

Conclusão 👀

Assim, esse artigo introduziu um pouco sobre a View ou One Above All que está presente nesse UIniverse do Android, e como o Framework lida com ela.

Nós próximos artigos iremos nos aprofundar mais nessa entidade, e sim, essa série é só sobre View e iremos passar por todo um processo de conhecer o comportamento dela, como criar até chegar em customizações mais avançadas como animações. Também teremos uma outra série dedicada a um carinha muito carismático: o Canvas. 🎨

Referências
Esse artigo é fortemente inspirado na comunidade e em desenvolvedores notáveis como: Romain Guy e Ian NI-Lewis.

Próximo episódio

Se esse artigo te deixou com alguma dúvida, não hesite em perguntar ou se preferir você pode entrar em contato comigo nas seguintes redes sociais:

Twitter: @coreydevv
LinkedIn: Lucas Cavalcante

Android View will return.

--

--