Animações com o MotionLayout — Parte 1

Edilson Ngulele
GDG Maputo
Published in
5 min readNov 15, 2018

Criar animações para a interface nem sempre foi uma tarefa muito divertida, embora que quando bem feitas elas são bonitas de se ver, é necessário muito código e ficheiros layout longos para que a magia aconteça.

Com o aparecimento do ConstraintLayout tornou-se possível criar animações com poucas linhas de código, mas os ficheiros layout longos continuam.

O MotionLayout veio para resolver isso, com algumas tags de xml e zero código é possível criar animações bem decentes.

Source: http://gph.is/1rikxBG

Esta série está divida da seguinte forma:

  • Introdução ao MotionLayout
  • Animações com o MotionLayout Parte I (Básico) (Estamos aqui)
  • Animações com o MotionLayout Parte II (Intermédio)
  • Animações com o MotionLayout Parte III (Complexo)

Antes de colocarmos a mão na massa, é importante perceber os seguintes conceitos:

  • MotionScene
  • ConstraintSet
  • Custom Attribute

MotionScene

A diferença principal entre o ContraintLayout e o MotionLayout é que o ConstraintLayout descreve todas as suas animações e os elementos do layout num mesmo ficheiro xml, o que por vezes pode causar alguma confusão a medida que o ficheiro vai crescendo e acabamos nos perdendo no meio de tantas tags.

O MotionLayout, por outro lado, deixa tudo separado, isto é, ele coloca toda a informação relativa às animações em um ficheiro separado permitindo-nos focar em uma coisa de cada vez. Esse ficheiro é chamado de MotionScene.

É no MotionScene onde definimos:

  • ConstraintSets
  • Transições
  • Ações de toque
  • Keyframes, e outros.

ConstraintSet

O ConstraintSet agrupa todas as regras de posicionamento para o seu layout, isto é, o posicionamento dos seus elementos. Tu podes utilizar vários ConstraintSets, eles permitem alterar a posição e dimensões dos seus elementos sem precisar ter que recriá-las.

Custom Attribute

Para alem agrupar as regras de posicionamento do layout, o ConstraintSet pode levar consigo um Custom Atribute, que são basicamente atributos (cor, largura, cumprimento, etc) de um determinado elemento do ConstraintSet. Esses atributos podem ser alterados durante as animações e transições.

Esses conceitos parecem ser um bocado difíceis de perceber no inicio mas com o exemplo que trago aqui irás percebê-los melhor.

Mas antes de começarmos, certifique-se que:

  • Tenhas o Android Studio 3.1.3 (ou versão superior)
  • Entendas um bocado de ConstraintLayout.

Vamos a isso!

Está na hora de criarmos a nossa primeira animação. Vamos começar com algo bem básico:

Temos dois eventos na tela acima:

  1. Um quadrado que é arrastado para baixo e para cima através do toque;
  2. A sua cor muda durante a transição;

Primeiro vamos criar o quadrado, arrastá-lo cima à baixo e por ultimo alterar a sua cor no processo.

1. Arrastar o quadrado

Para começar, vamos criar dois ficheiros layout, um com o quadrado no topo da tela e o outro com o quadrado na parte inferior. Vou chamar de motion_start e motion_end, respectivamente.

Primeiro layout:

Segundo layout:

Perfeito! Estamos quase lá.

Precisamos criar o nosso MotionLayout, e para fazer isso é muito simples. Para este exemplo vamos utilizar o activity_main.xml como o MotionLayout.

Por defeito, ao criarmos um ficheiro layout ele vem com o ConstraintLayout como raiz. Nós vamos converter o ConstraintLayout doactivity_main para MotionLayout da seguinte forma:

Substituindo: <android.support.constraint.ConstraintLayout.../>

Por: <android.support.constraint.motion.MotionLayout…/>

Após a conversão, vamos adicionar o quadrado no layout. Ficará assim:

Lembras-te do MotionScene? Precisamos indicar ao MotionLayout onde está o seu MotionScene, fazemos isso através do layoutDescription=”@xml/scene”. Todas as animações e transições serão definidas no scene.xml.

Onde:

Transitions: Define todos os parâmetros para a transição entre os layouts. Faz a transição do layout motion_start para o motion_end.

OnSwipe: Permite fazer a transição acompanhando o movimento do dedo.

touchAnchorId: Indica o objecto que iremos acompanhar com o movimento do dedo, neste caso a box.

touchAnchorSide: Indica o lado do objecto que irá acompanhar o movimento do dedo, que é o lado inferior do quadrado (bottom).

dragDirection: Indica a direção do movimento (dragUp).

Corremos a app e voilà….!

Tu provavelmente deves estar a pensar: “Porquê tantos ficheiros layout? 😒 Pensei que MotionLayout fosse tornar tudo mais simples e organizado! Edilson tu és um mentiroso!!!!!😡

Calma ai, não é o fim do mundo, na verdade nós podemos aproveitar ainda mais o MotionLayout utilizando um conceito que chamamos de MotionScene Independente.

Um MotionScene Independente permite-nos agrupar todos ConstraintSets num mesmo ficheiro, eliminando a necessidade de se criar vários ficheiros layout com os elementos em posições diferentes. Vamos adicionar dois ConstraintSets ao nosso MotionScene (scene.xml), um indicando a posição do quadrado na parte superior da tela e o segundo para a parte inferior.

Ficará assim:

E o resultado é o mesmo:

Como podes ver, o constraintSetEnd e o constraintSetStart já não estão a apontar para o motion_end e o motion_start mas sim para os ConstraintSets (end e start) com as posições do nosso quadrado. Podes eliminar os ficheiros motion_start e motion_end pois eles já não têm nenhuma utilidade.

2. Alterar a cor

Para alterar a cor do quadrado vamos precisar apenas definir um CustomAttribute para cada ConstraintSet indicado a cor para cada estado.

<CustomAttribute
motion:attributeName="backgroundColor"
motion:customColorValue="#008577"/>

Onde:

attributeName: É o nome atributo

customColorValue: É o valor do atributo, nesse caso, a cor.

Adicionando CustomAttributes ao nosso MotionScene:

Resultado:

E já está, com algumas tags e zero código conseguimos criar a melhor animação do mundo. Muito bom, já podes trabalhar para empresas como Google e Facebook. 🙌🏽👏🏽😎

Bônus

No próximo artigo vamos ver algumas animações mais elaboradas e um bocado mais interessantes. Vamos utilizar os Keyframes que irão que permitir fazer alterações ao objecto num determinado instante da sua transição. Por exemplo:

É isso!

Chegamos ao fim artigo, acho que com esta introdução já podemos aprofundar um bocado mais o MotionLayout. No próximo artigo veremos mais tributos do MotionLayout, e claro, trarei alguns exemplos.

Aqui vai o link para o exemplo que acabamos de ver.

Se tiver alguma questão ou sugestão deixe aí nos comentários e não hesite em contactar-me pelo email: edilsonngulele@gmail.com ou twitter: @edilson_ngulele

Obrigado e até a próxima!

Obrigado Paulo Enoque pela revisão!

--

--

Edilson Ngulele
GDG Maputo

Just a regular guy who loves coding and writing about Google Technologies | Project Manager @ MozDevz