SlideShare une entreprise Scribd logo
1  sur  54
Télécharger pour lire hors ligne
Lottie API
Para
Animações
no Android
thiengo.com.br
Animação no Android
Há inúmeras APIs, nativas e não nativas, somente para animação no Android. A
ObjectAnimator e a Facebook Keyframes provavelmente estão entre as mais
populares, digo, populares depois da Lottie API.
Com exceção da Lottie, todas as outras APIs para animação no Android vêm
carregadas de limitações:
• Ou não é nada trivial a codificação para conseguir até mesmo simples
animações sincronizadas;
• Ou as funcionalidades da API não permitem que tenhamos em projeto nada
melhor do que um GIF (ou PNG animado) com qualidade abaixo da esperada.
Então a Lottie API é perfeita, não tem limitações?
Sim, ela tem limitações. Mas o suporte é bem mais completo do que, por exemplo,
o Android Vector Drawable (AVD), API nativa que não suporta o mesmo número de
características do After Effects que a Lottie API suporta.
Conhecendo e codificando:
Android Lottie API
Lottie API
A biblioteca Lottie foi criada pelos engenheiros de
desenvolvimento do AirBnb com o propósito de
permitir animações mais completas em sistemas
mobile e Web.
Aqui o termo "mais completas" é sinônimo de: maior
suporte às animações criadas no Adobe After Effects,
hoje um dos principais softwares no mercado para a
criação de animações digitais.
O nome Lottie é uma homenagem a uma diretora
alemã, Lotte Reiniger, que é a criadora da mais antiga
filmagem de longa metragem ainda existente, o filme
The Adventures of Prince Achmed de 1926.
As animações que rodarão junto aos códigos Lottie de
seu projeto devem ser criadas no After Effects e então
exportadas como arquivos JSON, exportação
realizada junto ao uso do plugin open source
Bodymovin.
Clique aqui para abrir a animação
Não desanime, temos a LottieFiles.com
Essa parte de: criar animação; e exportar da
maneira correta. Isso não é nada trivial para nós
desenvolvedores de software.
Eu particularmente não acredito ser um bom
investimento em carreira focar também nos
estudos de criação de animações, até porque
não é algo que, para gerar qualidade, será
aprendido da noite para o dia, terá uma curva
de aprendizagem de médio longo prazo nessa
jornada.
Mas não se preocupe caso você não tenha o
conhecimento sobre o After Effects e nem
mesmo um profissional de animação ao seu
lado.
Nós programadores temos um site somente
com animações open source: LottieFiles.com.
As animações são todas preparadas para rodar junto a API Lottie, animações já
exportadas em JSON com o uso do After Effects e Bodymovin.
É possível até mesmo editar as cores da animação escolhida depois de acionar
"Customize with Bodymovin Editor”:
Não deixe de acompanhar o projeto de exemplo no artigo deste conjunto de slides,
pois nele utilizaremos duas animações diretamente da LottieFiles.
Instalação da API
A API está no repositório jcenter(), logo, temos apenas que adicionar a referência a
ela no Gradle App Level, ou build.gradle (Module: app):
Na época da construção deste conjunto de slides a versão mais atual e que rodava
sem problemas as funcionalidades propostas pela API era a versão beta: 2.6.0-
beta19.
Mas recomendo que somente utilize uma versão beta em seu projeto oficial, que irá
a produção, se depois de uma bateria de testes for constatado que a API mesmo
em versão beta roda sem problema algum.
Animação local, folder /assets, com LottieAnimationView
Agora a parte que mais empolga na API: os códigos simples para ter animações
completas.
A LottieAnimationView é uma das classes presentes para executar animações,
além de ser a mais recomendada na documentação oficial da Lottie API.
Antes de apresentar o código de exemplo vale informar que a
LottieAnimationView herda de ImageView, ou seja, é possível utilizar todas as
características de um ImageView utilizando somente a LottieAnimationView,
mesmo para carregamento de imagens estáticas.
Assim um código XML de exemplo:
Como com qualquer outra View, podemos trabalhar toda a criação e configuração
da LottieAnimationView também em código dinâmico, em programação. Mas eu
fortemente recomendo que você deixe o que é estático em arquivo de conteúdo
estático, como um file XML.
Os atributos lottie_ são muitos, vamos a explicação dos utilizados em código
anterior:
• lottie_autoPlay: inicia a animação dispensando a necessidade de invocação
de playAnimation() em código;
• lottie_fileName: permite que tanto animações .json quanto animações
em .zip possam ser carregadas diretamente do folder /assets. Caso a
animação android_wave.json estivesse, por exemplo, dentro do folder /
assets/minhas_animacoes então a referência em lottie_fileName seria
"minhas_animacoes/android_wave.json";
• lottie_loop: indica se a animação vai continuar em repetição assim que
finalizada.
Executando o código anterior, temos:
Confesso que fiquei confuso quando você informou sobre animações também
em .zip. O que seria isso?
Um exemplo são as animações criadas com o uso de imagens, neste caso será
exportado do After Effects, junto ao Bodymovin, um .zip contendo o arquivo JSON
da animação vetorial e as imagens referenciadas neste arquivo JSON.
Clique aqui para abrir a animação
Animação local, folder /raw
Também é possível carregar
animações locais diretamente do
folder /drawable/raw, mas neste
diretório somente animações .json é
que serão carregadas. Veja o código
de exemplo:
Dessa vez o atributo de referência a
animação é o lottie_rawRes.
Executando o código anterior,
temos:
Clique aqui para abrir a animação
Para facilitar ainda mais a vida do desenvolvedor Android, temos a possibilidade de
carregar animações diretamente da rede.
Toda a configuração de cache e requisição remota é abstraída do domínio do
desenvolvedor, somente temos de colocar a url correta e ver a animação acontecer.
Segue código de exemplo:
Animação remota, utilizando lottie_url
O atributo lottie_url também aceita referencias a arquivos .zip. Executando o
código anterior, temos:
Thiengo, então se eu quiser carregar alguma imagem remota utilizando o lottie_url
conseguirei sem problemas?
Não. O atributo lottie_url é somente para animações After Effects em .json ou .zip.
Imagens ainda têm de ser carregadas via android:src, digo, imagens locais. Para
imagens remotas você pode utilizar o Universal Image Loader.
Clique aqui para abrir a animação
Lembrando que para carregamento remoto de animação é preciso ao menos a
permissão de Internet no AndroidManifest.xml:
Importante: somente escolha por animações remotas se essa realmente for a
melhor opção em seu domínio de problema, pois animações remotas dependem
até mesmo da disponibilidade de banda do usuário.
Para ouvir a cada nova atualização de frame na animação podemos implementar a
Interface ValueAnimator.AnimatorUpdateListener como a seguir:
Listener de atualização de animação
Assuma que aqui estamos utilizando o plugin kottlin-android-extensions e assim a
propriedade lav_time_zip é equivalente ao ID de uma LottieAnimationView em
tela. Enquanto a animação estiver ocorrendo o método onAnimationUpdate() é
invocado.
O parâmetro animator, do tipo ValueAnimator, nos permite acesso (e modificação) a
algumas configurações de animação. Mas segundo meus testes, realizar
atualizações em animação, quando necessário, ainda tem como melhor caminho o
uso da instância de LottieAnimationView.
Listener de início, de fim, de repetição e de cancelamento de
animação
Para ouvir os triggers de
início, de fim, de repetição
e de cancelamento de
animação devemos
implementar a Interface
Animator.AnimatorListen
er. Veja o código ao lado:
Como explicado no código do slide anterior, o parâmetro animator na verdade é
também do tipo ValueAnimator como em onAnimationUpdate(), apresentado na
seção (tópico em slides) anterior.
Importante: o conhecimento completo dos listerners Lottie é necessário, pois
certamente você os utilizará para acionamento de funcionalidades de seu domínio
de problema.
Progresso de animação via propriedade progress
É possível controlar o andamento da animação via código de programação, para
isso temos de atualizar a propriedade progress como no código de exemplo a
seguir.
Primeiro o trecho XML:
Então o código Kotlin (poderia ser Java, com quase as mesmas configurações):
Como informado em código XML: independente da duração da animação, o valor
que deve ser abordado em progress deve estar entre, incluindo eles, 0.0F e 1.0F.
Executando o código anterior, temos:
O SeekBar foi utilizado para facilitar o exemplo, mas progress pode ser atualizado
em qualquer contexto que esteja dentro da thread UI.
Clique aqui para abrir a animação
Trabalhando com frames
O trabalho com os frames da animação se faz necessário principalmente se você desenvolvedor Android
for utilizar alguma animação baixada da Internet, ou seja, animação After Effects que não foi desenvolvida
especificamente para o seu domínio de problema.
Com a configuração de frame é possível definir o ponto que a animação se inicia e o ponto que ela finaliza,
mesmo se a configuração de loop estiver em true.
Antes de partirmos para o código de exemplo, veja quais são os métodos que permitem a configuração de
frames:
• setMinFrame( Int ): permiti definir em qual parte, frame, a animação se iniciará. O argumento é um
Int entre 0 e o último frame existente na animação;
• setMaxFrame( Int ): permiti definir em qual parte, frame, a animação finalizará. A configuração de
argumento é como em setMinFrame();
• setMinAndMaxFrame( Int, Int ): permiti a definição de frame mínimo e máximo em animação;
• setMinProgress( Float ): permiti definir em qual ponto se iniciaria a animação. O argumento é do
tipo Float e deve variar entre 0.0F e 1.0F;
• setMaxProgress( Float ): permiti definir em qual ponto se finalizará a animação. A configuração de
argumento é a mesma em setMinProgress();
• setMinAndMaxProgress( Float, Float ): permiti, em uma única invocação, a definição de progresso
mínimo e máximo;
• frame: propriedade que permite definir, ou obter, o frame atual da animação em tela.
Caso você não tenha em mãos a informação de total de frames presente em uma
animação, é possível utilizar a propriedade maxFrame para saber o total de frames
nela:
Note que você somente obterá o valor real em maxFrame se a animação já estiver
renderizada em tela, ou seja, pode ser que um código similar ao seguinte seja
necessário:
Com isso podemos ir ao código de exemplo. Primeiro a parte XML, sem ainda a
definição de min e max frame:
Executando o código anterior, temos:
Clique aqui para abrir a animação
Agora a parte de programação, já com a definição de min e max frame:
A animação em teste tem um total de 180 frames, mas no código acima cortamos
isso. Executando o algoritmo com o trecho anterior incluído, temos:
Animação de duração bem inferior, de 180 frames (aproximadamente 6 segundos)
para 50 frames (aproximadamente 1.8 segundos).
Clique aqui para abrir a animação
Trabalhando a velocidade (duração) da animação
Com a propriedade speed é possível definir em qual velocidade a animação vai
trabalhar. speed aceita um valor Float, onde 1.0F é o valor da velocidade padrão.
Valores menores que 1.0F diminuem a velocidade da animação e valores maiores
aumentam.
A seguir o código XML de exemplo de uma LottieAnimationView sem alteração
em speed:
Executando o código anterior, temos:
Clique aqui para abrir a animação
Agora o código que acelera a animação:
Executando o código anterior, temos:
Uma animação de 4 segundos para agora aproximados 1.1 segundos.
Clique aqui para abrir a animação
Se um valor negativo for fornecido em speed, a animação trabalha de maneira
invertida. Segue atualização do código anterior:
Executando a última atualização, temos:
Clique aqui para abrir a animação
Número e modelo de repetições
É possível ser mais específico quanto a característica de loop e definir exatamente
quantas vezes uma repetição deverá ocorrer. Também é possível definir o modo da
repetição.
A seguir um LottieAnimationView de exemplo:
Executando o trecho anterior, temos:
Clique aqui para abrir a animação
Agora definindo o repeatCount e o repeatMode:
Executando novamente, agora com o trecho atualizado, temos:
Clique aqui para abrir a animação
A propriedade repeatCount define, ou retorna, quantas vezes a animação deve ser
repetida. Se a contagem de repetições for 0, a animação nunca será repetida. Se a
contagem de repetições for maior do que 0 ou então LottieDrawable.INFINITE, o
modo de repetição será levado em consideração. O valor padrão é 0.
A propriedade repeatMode aceita os seguintes valores:
• LottieDrawable.RESTART: quando a animação chega ao fim e repeatCount
é LottieDrawable.INFINITE ou um valor positivo, a animação é reiniciada;
• LottieDrawable.REVERSE: quando a animação chega ao final e
repeatCount é LottieDrawable.INFINITE ou um valor positivo, a animação
inverte a direção em cada nova iteração;
• LottieDrawable.INFINITE (esta constante tem real efeito quando em
repeatCount): valor utilizado com a propriedade repeatCount para repetir a
animação indefinidamente.
Modificando a cor com lottie_colorFilter
Para modificar a cor total de uma animação é tão simples quanto ativar / desativar
o loop dela. A seguir o LottieAnimationView de uma animação com cores
originais.
Executando o projeto com o código anterior, temos:
Clique aqui para abrir a animação
Agora o mesmo LottieAnimationView com o lottie_colorFilter configurado:
Executando o projeto com a nova configuração de animação, temos:
Note que o efeito positivo de lottie_colorFilter ocorre quando a animação tem
transparência também na parte interna dela, caso contrário ficará tudo de uma
única cor, ou seja, não haverá animação.
Clique aqui para abrir a animação
Animação com LottieDrawable
Além da API LottieAnimationView temos a API LottieDrawable que
resumidamente nos permite: colocar drawables animados em componentes que
aceitam arquivos drawables.
A seguir um ImageView de exemplo, View que receberá uma animação presente
no folder /assets:
Agora o código dinâmico que ativa a animação no ImageView anterior:
Executando o código anterior, temos:
Clique aqui para abrir a animação
É importante ressaltar que o recomendado em documentação é o uso da API
LottieAnimationView. São raros os casos onde a LottieDrawable poderá ser utilizada
e a LottieAnimationView não.
Eu particularmente me interessei pela LottieDrawable para utiliza-la junto a alguma
Spanned String, pois sei que é possível colocar drawables nesse tipo de String.
Porém em meus testes foi constatado que um drawable animado não é carregado em
uma Spanned String. Se você teve resultados diferentes, não deixe de comentar aqui
no artigo deste conjunto de slides.
A LottieDrawable é pouco documentada e a maioria dos códigos utilizando ela, e
disponíveis na comunidade Android, são códigos depreciados.
Quando realizei os testes a invocação
LottieComposition.Factory.fromAssetFileName() era apresentada como depreciada,
mas foi o único exemplo válido encontrado.
Logo, prefira o uso da LottieAnimationView, pois, em minha opinião, há fortes indícios
de que a LottieDrawable não continuará como uma entidade pública.
Uma informação importante para aqueles que tentarão a LottieDrawable é que: ao final
do processamento, quando a animação não é mais útil, o método recycleBitmaps()
deve ser invocado, pode ser até mesmo no onDestroy() da atividade host da animação.
KeyPath para a animação de partes separadas
Um arquivo de animação gerado via After Effects junto ao Bodymovin, esse arquivo
tem uma estrutura JSON hierárquica onde o todo se chama Composition e os
objetos que integram o todo são denominados Layers.
Cada layer, camada, tem um nome e pode ser atualizado de maneira
independente.
A seguir um LottieAnimationView que ainda não passou por nenhuma atualização
independente de layer:
Executando o projeto com o simples LottieAnimationView anterior, temos:
Clique aqui para abrir a animação
Agora o código onde modificaremos as cores das montanhas da animação de
fotografia:
Para a aplicação de animação em layer, o método addValueCallback() deve ser
utilizado, com os parâmetros:
• KeyPath: que permite identificar, pelo nome, os layers que serão atualizados.
A chave "**" indica a correspondência para zero ou mais layers. Para a
definição de cor não foi possível colocar mais de um layer por método
addValueCallback() e sempre, como último argumento em KeyPath, é
necessária a definição de "**";
• Property: que identifica a propriedade que será atualizada nos KeyPaths
indicados em primeiro argumento. Aqui definimos que a propriedade de cor é
que será atualizada, LottieProperty.COLOR_FILTER. Em Animatable
Properties há todas as propriedades passíveis de atualização independente;
• Callback: instância que contém a configuração de atualização da propriedade
definida em segundo argumento. Tem que ser uma LottieValueCallback.
Os termos "Mountain front" e "Mountain back" foram encontrados no arquivo
JSON de animação. Os nomes dos layers de sua animação estão sempre nas
chaves nm.
Executando o projeto Android com o código anterior de atualização de layer, temos:
Clique aqui para abrir a animação
Agora a atualização de posicionamento da montanha de trás, a montanha azul:
Note que diferente da animação da propriedade de cor, aqui não precisamos da
chave "**" para que a atualização ocorra.
Eu sei, isso é um pouco estranho, mas acredite, descobri isso na "martelada", pois
a documentação sobre KeyPath na doc oficial da Lottie API é bem simples, não diz
muito em termos de código.
Executando o projeto com novo algoritmo, temos:
Clique aqui para abrir a animação
Mais opções de configuração
A seguir mais algumas opções de configuração que podem ser acessadas,
algumas também podem ser atualizadas, além das já apresentadas até aqui.
Note que todas as configurações a seguir somente retornarão valores válidos se
forem invocadas depois de a animação já estar renderizada em tela. Segue:
Muitas das configurações apresentadas no slide anterior são bem especificas para
aqueles profissionais que têm um conhecimento mais apurado sobre as
necessidades das animações em uso, por exemplo: a propriedade
useHardwareAcceleration que permite um developer com expertise em animação
tomar decisões de processamento com base no valor retornado desta entidade.
Tamanho (altura x largura) da animação
As animações criadas com o After Effects e exportadas com o plugin Bodymovin
são animações vetoriais, ou seja, não há necessidade de criar animações com
exacerbadas largura e altura.
A documentação oficial da Lottie API recomenda que as animações, quando o
maior tamanho possível é necessário, sejam criadas nas dimensões 411px x
731px, pois a Lottie API transformará esses valores em DPs.
De qualquer forma, caso você tenha problemas com a cobertura da animação em
tela, lembre que LottieAnimationView herda de ImageView e assim é possível
utilizar com sucesso o atributo android:scaleType com os valore centerInside ou
centerCrop.
Pontos negativos
• A documentação não está atualizada ao menos em relação a versão mais
atual da API na época da construção deste conteúdo, a versão 2.6.0-beta19;
• Não há um mínimo exemplo funcional com a LottieDrawable. Se essa API
não tem tanta importância assim ela poderia ser removida;
• Os exemplos com KeyPath, animação independente de layer, também são
escassos.
Pontos positivos
• As animações podem ser invocadas com poucas linhas de código, exigindo
um mínimo apenas em código XML, facilitando a construção do projeto;
• Todo o trabalho de carregamento e gerência de animação em cache já é
realizado pela própria API;
• A herança do ImageView facilita em muito o enquadramento da animação em
tela, quando necessário;
• A possibilidade de carregamento de animação em servidor remoto é outro
ponto de destaque. Como código extra somente temos de definir a permissão
de Internet.
Conclusão
Animações, sem sombra de dúvidas, trarão maior profissionalismo ao seus
projetos Android. A Lottie API permitirá que você consiga isso sem muito esforço.
Somente tome cuidado com a quantidade de animações carregadas em tela, pois
em testes realizados foi constatado que quanto mais animação em tela, maior a
necessidade de processamento e menos responsivo fica o aplicativo, afetando
diretamente a experiência do usuário.
Lembre que caso você não tenha um artista de animações After Effects ao seu
lado e também não tenha expertise em criação de animações com este software,
você tem o site LottieFiles que certamente, junto a configurações
LottieAnimationView, lhe permitirá obter o máximo de animação em seu domínio
de problema.
Tutorias para criação de animações no After Effects
Caso você como desenvolvedor Android queira arriscar no aprendizado de
animações no Adobe After Effects, a seguir deixo alguns tutoriais que poderão lhe
ajudar com isso:
• Tutorial BÁSICO de ANIMAÇÃO | After Effects;
• COMO FAZER 5 ANIMAÇÕES INCRÍVEIS no AFTER EFFECTS com
SHAPES!;
• After Effects-Animação simples;
• Tutorial Swift iOS: Exportando animações do After Effects com Bodymovin e
Lottie;
• Instalação e configuração do Lottie no After Effects.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• https://www.thiengo.com.br/lottie-api-para-animacoes-no-android
Fontes:
• http://airbnb.io/lottie/
• https://medium.com/airbnb-engineering/introducing-lottie-4ff4a0afac0e
• https://share.atelie.software/a-nova-era-de-anima%C3%A7%C3%B5es-
mobile-com-lottie-3c0bca980782
• https://medium.com/blog-do-mitrut/suas-uis-animadas-com-
lottie-431c4176623e
Para estudo
• Treinamento oficial:
• Prototipagem Profissional de Aplicativos Android.
• Meus livros:
• Receitas Para Desenvolvedores Android;
• Refatorando Para Programas Limpos.
• Redes:
• Udemy;
• YouTube;
• Facebook;
• LinkedIn;
• GitHub;
• Twitter;
• Google Plus.
• Blog App.
Lottie API Para Animações no
Android
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Contenu connexe

Tendances

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Vinícius Thiengo
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarVinícius Thiengo
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioVinícius Thiengo
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingVinícius Thiengo
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarVinícius Thiengo
 
ViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaVinícius Thiengo
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidVinícius Thiengo
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalVinícius Thiengo
 
Como Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidComo Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidVinícius Thiengo
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIVinícius Thiengo
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidVinícius Thiengo
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidVinícius Thiengo
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoVinícius Thiengo
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidVinícius Thiengo
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidSidney Roberto
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - BásicoHugoDalevedove
 
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...Tchelinux
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidJosé Alexandre Macedo
 

Tendances (20)

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
 
ViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de Arquitetura
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
 
Como Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidComo Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no Android
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para Android
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
Android Aprendiz
Android AprendizAndroid Aprendiz
Android Aprendiz
 

Similaire à Lottie API para Animações no Android

Tutorial After Effects - Fernando Moreira
Tutorial After Effects - Fernando MoreiraTutorial After Effects - Fernando Moreira
Tutorial After Effects - Fernando Moreirafabricastartups
 
Aprendendo Angular com a CLI
Aprendendo Angular com a CLIAprendendo Angular com a CLI
Aprendendo Angular com a CLIVanessa Me Tonini
 
Apostila adobe premiere_portugues_www.clickcursos.net_
Apostila adobe premiere_portugues_www.clickcursos.net_Apostila adobe premiere_portugues_www.clickcursos.net_
Apostila adobe premiere_portugues_www.clickcursos.net_BomSoul
 
Ionic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPIonic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPFabio Godoy
 
introdução a visão compuutacional com opencv e python
introdução a visão compuutacional com opencv e pythonintrodução a visão compuutacional com opencv e python
introdução a visão compuutacional com opencv e pythonwhanderley freitas
 
8 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii28 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii2Renato Lucena
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaLoiane Groner
 
1503 - Revista - Angular.pdf
1503 - Revista - Angular.pdf1503 - Revista - Angular.pdf
1503 - Revista - Angular.pdfjoaoJunior93
 
Introducao a Linguagem Kotlin
Introducao a Linguagem KotlinIntroducao a Linguagem Kotlin
Introducao a Linguagem KotlinCalebeMiquissene
 
Parse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaParse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaRudson Lima
 
PHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaPHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaMarcelo Fleury
 
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.Ricardo Ogliari
 
Iniciando o desenvolvimento de uma aplicação em android
Iniciando o desenvolvimento de uma aplicação em androidIniciando o desenvolvimento de uma aplicação em android
Iniciando o desenvolvimento de uma aplicação em androidErivan Cledson
 
Desenvolvendo com Angular CLI
Desenvolvendo com Angular CLIDesenvolvendo com Angular CLI
Desenvolvendo com Angular CLIVanessa Me Tonini
 
APIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoAPIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoFábio Rosato
 
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Natan Moraes
 
Tutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMITutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMISimão Neto
 

Similaire à Lottie API para Animações no Android (20)

Tutorial After Effects - Fernando Moreira
Tutorial After Effects - Fernando MoreiraTutorial After Effects - Fernando Moreira
Tutorial After Effects - Fernando Moreira
 
Aprendendo Angular com a CLI
Aprendendo Angular com a CLIAprendendo Angular com a CLI
Aprendendo Angular com a CLI
 
Apostila adobe premiere_portugues_www.clickcursos.net_
Apostila adobe premiere_portugues_www.clickcursos.net_Apostila adobe premiere_portugues_www.clickcursos.net_
Apostila adobe premiere_portugues_www.clickcursos.net_
 
Ionic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APPIonic Framework - Configuração do ambiente e a criação da primeira APP
Ionic Framework - Configuração do ambiente e a criação da primeira APP
 
Widget
WidgetWidget
Widget
 
Fazendo um gif animado
Fazendo um gif animadoFazendo um gif animado
Fazendo um gif animado
 
introdução a visão compuutacional com opencv e python
introdução a visão compuutacional com opencv e pythonintrodução a visão compuutacional com opencv e python
introdução a visão compuutacional com opencv e python
 
8 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii28 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii2
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e Cordova
 
1503 - Revista - Angular.pdf
1503 - Revista - Angular.pdf1503 - Revista - Angular.pdf
1503 - Revista - Angular.pdf
 
Introducao a Linguagem Kotlin
Introducao a Linguagem KotlinIntroducao a Linguagem Kotlin
Introducao a Linguagem Kotlin
 
Parse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaParse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da força
 
PHP Symfony, Vale A Pena
PHP Symfony, Vale A PenaPHP Symfony, Vale A Pena
PHP Symfony, Vale A Pena
 
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.
Instalando e Configurando o JIL SDK. Crie seu primeiro widget com a ferramenta.
 
Html básico 2 imagens
Html básico 2   imagensHtml básico 2   imagens
Html básico 2 imagens
 
Iniciando o desenvolvimento de uma aplicação em android
Iniciando o desenvolvimento de uma aplicação em androidIniciando o desenvolvimento de uma aplicação em android
Iniciando o desenvolvimento de uma aplicação em android
 
Desenvolvendo com Angular CLI
Desenvolvendo com Angular CLIDesenvolvendo com Angular CLI
Desenvolvendo com Angular CLI
 
APIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoAPIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construção
 
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
 
Tutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMITutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMI
 

Plus de Vinícius Thiengo

7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria LerVinícius Thiengo
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria lerVinícius Thiengo
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidVinícius Thiengo
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidVinícius Thiengo
 

Plus de Vinícius Thiengo (6)

7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
 
Material Design
Material DesignMaterial Design
Material Design
 

Dernier

INTERVENÇÃO PARÁ - Formação de Professor
INTERVENÇÃO PARÁ - Formação de ProfessorINTERVENÇÃO PARÁ - Formação de Professor
INTERVENÇÃO PARÁ - Formação de ProfessorEdvanirCosta
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxLuizHenriquedeAlmeid6
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfCamillaBrito19
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....LuizHenriquedeAlmeid6
 
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresAnaCarinaKucharski1
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMHELENO FAVACHO
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelGilber Rubim Rangel
 
Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)ElliotFerreira
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESEduardaReis50
 
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...IsabelPereira2010
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médiorosenilrucks
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...azulassessoria9
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteVanessaCavalcante37
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 

Dernier (20)

INTERVENÇÃO PARÁ - Formação de Professor
INTERVENÇÃO PARÁ - Formação de ProfessorINTERVENÇÃO PARÁ - Formação de Professor
INTERVENÇÃO PARÁ - Formação de Professor
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
o ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdfo ciclo do contato Jorge Ponciano Ribeiro.pdf
o ciclo do contato Jorge Ponciano Ribeiro.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
 
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos DescritoresATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
ATIVIDADE PARA ENTENDER -Pizzaria dos Descritores
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim Rangel
 
Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
 
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 

Lottie API para Animações no Android

  • 2. Animação no Android Há inúmeras APIs, nativas e não nativas, somente para animação no Android. A ObjectAnimator e a Facebook Keyframes provavelmente estão entre as mais populares, digo, populares depois da Lottie API. Com exceção da Lottie, todas as outras APIs para animação no Android vêm carregadas de limitações: • Ou não é nada trivial a codificação para conseguir até mesmo simples animações sincronizadas; • Ou as funcionalidades da API não permitem que tenhamos em projeto nada melhor do que um GIF (ou PNG animado) com qualidade abaixo da esperada. Então a Lottie API é perfeita, não tem limitações? Sim, ela tem limitações. Mas o suporte é bem mais completo do que, por exemplo, o Android Vector Drawable (AVD), API nativa que não suporta o mesmo número de características do After Effects que a Lottie API suporta.
  • 4. Lottie API A biblioteca Lottie foi criada pelos engenheiros de desenvolvimento do AirBnb com o propósito de permitir animações mais completas em sistemas mobile e Web. Aqui o termo "mais completas" é sinônimo de: maior suporte às animações criadas no Adobe After Effects, hoje um dos principais softwares no mercado para a criação de animações digitais. O nome Lottie é uma homenagem a uma diretora alemã, Lotte Reiniger, que é a criadora da mais antiga filmagem de longa metragem ainda existente, o filme The Adventures of Prince Achmed de 1926. As animações que rodarão junto aos códigos Lottie de seu projeto devem ser criadas no After Effects e então exportadas como arquivos JSON, exportação realizada junto ao uso do plugin open source Bodymovin. Clique aqui para abrir a animação
  • 5. Não desanime, temos a LottieFiles.com Essa parte de: criar animação; e exportar da maneira correta. Isso não é nada trivial para nós desenvolvedores de software. Eu particularmente não acredito ser um bom investimento em carreira focar também nos estudos de criação de animações, até porque não é algo que, para gerar qualidade, será aprendido da noite para o dia, terá uma curva de aprendizagem de médio longo prazo nessa jornada. Mas não se preocupe caso você não tenha o conhecimento sobre o After Effects e nem mesmo um profissional de animação ao seu lado. Nós programadores temos um site somente com animações open source: LottieFiles.com.
  • 6. As animações são todas preparadas para rodar junto a API Lottie, animações já exportadas em JSON com o uso do After Effects e Bodymovin. É possível até mesmo editar as cores da animação escolhida depois de acionar "Customize with Bodymovin Editor”: Não deixe de acompanhar o projeto de exemplo no artigo deste conjunto de slides, pois nele utilizaremos duas animações diretamente da LottieFiles.
  • 7. Instalação da API A API está no repositório jcenter(), logo, temos apenas que adicionar a referência a ela no Gradle App Level, ou build.gradle (Module: app): Na época da construção deste conjunto de slides a versão mais atual e que rodava sem problemas as funcionalidades propostas pela API era a versão beta: 2.6.0- beta19. Mas recomendo que somente utilize uma versão beta em seu projeto oficial, que irá a produção, se depois de uma bateria de testes for constatado que a API mesmo em versão beta roda sem problema algum.
  • 8. Animação local, folder /assets, com LottieAnimationView Agora a parte que mais empolga na API: os códigos simples para ter animações completas. A LottieAnimationView é uma das classes presentes para executar animações, além de ser a mais recomendada na documentação oficial da Lottie API. Antes de apresentar o código de exemplo vale informar que a LottieAnimationView herda de ImageView, ou seja, é possível utilizar todas as características de um ImageView utilizando somente a LottieAnimationView, mesmo para carregamento de imagens estáticas. Assim um código XML de exemplo:
  • 9. Como com qualquer outra View, podemos trabalhar toda a criação e configuração da LottieAnimationView também em código dinâmico, em programação. Mas eu fortemente recomendo que você deixe o que é estático em arquivo de conteúdo estático, como um file XML. Os atributos lottie_ são muitos, vamos a explicação dos utilizados em código anterior: • lottie_autoPlay: inicia a animação dispensando a necessidade de invocação de playAnimation() em código; • lottie_fileName: permite que tanto animações .json quanto animações em .zip possam ser carregadas diretamente do folder /assets. Caso a animação android_wave.json estivesse, por exemplo, dentro do folder / assets/minhas_animacoes então a referência em lottie_fileName seria "minhas_animacoes/android_wave.json"; • lottie_loop: indica se a animação vai continuar em repetição assim que finalizada.
  • 10. Executando o código anterior, temos: Confesso que fiquei confuso quando você informou sobre animações também em .zip. O que seria isso? Um exemplo são as animações criadas com o uso de imagens, neste caso será exportado do After Effects, junto ao Bodymovin, um .zip contendo o arquivo JSON da animação vetorial e as imagens referenciadas neste arquivo JSON. Clique aqui para abrir a animação
  • 11. Animação local, folder /raw Também é possível carregar animações locais diretamente do folder /drawable/raw, mas neste diretório somente animações .json é que serão carregadas. Veja o código de exemplo: Dessa vez o atributo de referência a animação é o lottie_rawRes. Executando o código anterior, temos: Clique aqui para abrir a animação
  • 12. Para facilitar ainda mais a vida do desenvolvedor Android, temos a possibilidade de carregar animações diretamente da rede. Toda a configuração de cache e requisição remota é abstraída do domínio do desenvolvedor, somente temos de colocar a url correta e ver a animação acontecer. Segue código de exemplo: Animação remota, utilizando lottie_url
  • 13. O atributo lottie_url também aceita referencias a arquivos .zip. Executando o código anterior, temos: Thiengo, então se eu quiser carregar alguma imagem remota utilizando o lottie_url conseguirei sem problemas? Não. O atributo lottie_url é somente para animações After Effects em .json ou .zip. Imagens ainda têm de ser carregadas via android:src, digo, imagens locais. Para imagens remotas você pode utilizar o Universal Image Loader. Clique aqui para abrir a animação
  • 14. Lembrando que para carregamento remoto de animação é preciso ao menos a permissão de Internet no AndroidManifest.xml: Importante: somente escolha por animações remotas se essa realmente for a melhor opção em seu domínio de problema, pois animações remotas dependem até mesmo da disponibilidade de banda do usuário.
  • 15. Para ouvir a cada nova atualização de frame na animação podemos implementar a Interface ValueAnimator.AnimatorUpdateListener como a seguir: Listener de atualização de animação Assuma que aqui estamos utilizando o plugin kottlin-android-extensions e assim a propriedade lav_time_zip é equivalente ao ID de uma LottieAnimationView em tela. Enquanto a animação estiver ocorrendo o método onAnimationUpdate() é invocado. O parâmetro animator, do tipo ValueAnimator, nos permite acesso (e modificação) a algumas configurações de animação. Mas segundo meus testes, realizar atualizações em animação, quando necessário, ainda tem como melhor caminho o uso da instância de LottieAnimationView.
  • 16. Listener de início, de fim, de repetição e de cancelamento de animação Para ouvir os triggers de início, de fim, de repetição e de cancelamento de animação devemos implementar a Interface Animator.AnimatorListen er. Veja o código ao lado:
  • 17. Como explicado no código do slide anterior, o parâmetro animator na verdade é também do tipo ValueAnimator como em onAnimationUpdate(), apresentado na seção (tópico em slides) anterior. Importante: o conhecimento completo dos listerners Lottie é necessário, pois certamente você os utilizará para acionamento de funcionalidades de seu domínio de problema.
  • 18. Progresso de animação via propriedade progress É possível controlar o andamento da animação via código de programação, para isso temos de atualizar a propriedade progress como no código de exemplo a seguir. Primeiro o trecho XML:
  • 19. Então o código Kotlin (poderia ser Java, com quase as mesmas configurações): Como informado em código XML: independente da duração da animação, o valor que deve ser abordado em progress deve estar entre, incluindo eles, 0.0F e 1.0F.
  • 20. Executando o código anterior, temos: O SeekBar foi utilizado para facilitar o exemplo, mas progress pode ser atualizado em qualquer contexto que esteja dentro da thread UI. Clique aqui para abrir a animação
  • 21. Trabalhando com frames O trabalho com os frames da animação se faz necessário principalmente se você desenvolvedor Android for utilizar alguma animação baixada da Internet, ou seja, animação After Effects que não foi desenvolvida especificamente para o seu domínio de problema. Com a configuração de frame é possível definir o ponto que a animação se inicia e o ponto que ela finaliza, mesmo se a configuração de loop estiver em true. Antes de partirmos para o código de exemplo, veja quais são os métodos que permitem a configuração de frames: • setMinFrame( Int ): permiti definir em qual parte, frame, a animação se iniciará. O argumento é um Int entre 0 e o último frame existente na animação; • setMaxFrame( Int ): permiti definir em qual parte, frame, a animação finalizará. A configuração de argumento é como em setMinFrame(); • setMinAndMaxFrame( Int, Int ): permiti a definição de frame mínimo e máximo em animação; • setMinProgress( Float ): permiti definir em qual ponto se iniciaria a animação. O argumento é do tipo Float e deve variar entre 0.0F e 1.0F; • setMaxProgress( Float ): permiti definir em qual ponto se finalizará a animação. A configuração de argumento é a mesma em setMinProgress(); • setMinAndMaxProgress( Float, Float ): permiti, em uma única invocação, a definição de progresso mínimo e máximo; • frame: propriedade que permite definir, ou obter, o frame atual da animação em tela.
  • 22. Caso você não tenha em mãos a informação de total de frames presente em uma animação, é possível utilizar a propriedade maxFrame para saber o total de frames nela: Note que você somente obterá o valor real em maxFrame se a animação já estiver renderizada em tela, ou seja, pode ser que um código similar ao seguinte seja necessário:
  • 23. Com isso podemos ir ao código de exemplo. Primeiro a parte XML, sem ainda a definição de min e max frame: Executando o código anterior, temos: Clique aqui para abrir a animação
  • 24. Agora a parte de programação, já com a definição de min e max frame: A animação em teste tem um total de 180 frames, mas no código acima cortamos isso. Executando o algoritmo com o trecho anterior incluído, temos: Animação de duração bem inferior, de 180 frames (aproximadamente 6 segundos) para 50 frames (aproximadamente 1.8 segundos). Clique aqui para abrir a animação
  • 25. Trabalhando a velocidade (duração) da animação Com a propriedade speed é possível definir em qual velocidade a animação vai trabalhar. speed aceita um valor Float, onde 1.0F é o valor da velocidade padrão. Valores menores que 1.0F diminuem a velocidade da animação e valores maiores aumentam. A seguir o código XML de exemplo de uma LottieAnimationView sem alteração em speed:
  • 26. Executando o código anterior, temos: Clique aqui para abrir a animação
  • 27. Agora o código que acelera a animação: Executando o código anterior, temos: Uma animação de 4 segundos para agora aproximados 1.1 segundos. Clique aqui para abrir a animação
  • 28. Se um valor negativo for fornecido em speed, a animação trabalha de maneira invertida. Segue atualização do código anterior: Executando a última atualização, temos: Clique aqui para abrir a animação
  • 29. Número e modelo de repetições É possível ser mais específico quanto a característica de loop e definir exatamente quantas vezes uma repetição deverá ocorrer. Também é possível definir o modo da repetição. A seguir um LottieAnimationView de exemplo:
  • 30. Executando o trecho anterior, temos: Clique aqui para abrir a animação
  • 31. Agora definindo o repeatCount e o repeatMode: Executando novamente, agora com o trecho atualizado, temos: Clique aqui para abrir a animação
  • 32. A propriedade repeatCount define, ou retorna, quantas vezes a animação deve ser repetida. Se a contagem de repetições for 0, a animação nunca será repetida. Se a contagem de repetições for maior do que 0 ou então LottieDrawable.INFINITE, o modo de repetição será levado em consideração. O valor padrão é 0. A propriedade repeatMode aceita os seguintes valores: • LottieDrawable.RESTART: quando a animação chega ao fim e repeatCount é LottieDrawable.INFINITE ou um valor positivo, a animação é reiniciada; • LottieDrawable.REVERSE: quando a animação chega ao final e repeatCount é LottieDrawable.INFINITE ou um valor positivo, a animação inverte a direção em cada nova iteração; • LottieDrawable.INFINITE (esta constante tem real efeito quando em repeatCount): valor utilizado com a propriedade repeatCount para repetir a animação indefinidamente.
  • 33. Modificando a cor com lottie_colorFilter Para modificar a cor total de uma animação é tão simples quanto ativar / desativar o loop dela. A seguir o LottieAnimationView de uma animação com cores originais. Executando o projeto com o código anterior, temos: Clique aqui para abrir a animação
  • 34. Agora o mesmo LottieAnimationView com o lottie_colorFilter configurado: Executando o projeto com a nova configuração de animação, temos: Note que o efeito positivo de lottie_colorFilter ocorre quando a animação tem transparência também na parte interna dela, caso contrário ficará tudo de uma única cor, ou seja, não haverá animação. Clique aqui para abrir a animação
  • 35. Animação com LottieDrawable Além da API LottieAnimationView temos a API LottieDrawable que resumidamente nos permite: colocar drawables animados em componentes que aceitam arquivos drawables. A seguir um ImageView de exemplo, View que receberá uma animação presente no folder /assets: Agora o código dinâmico que ativa a animação no ImageView anterior:
  • 36. Executando o código anterior, temos: Clique aqui para abrir a animação
  • 37. É importante ressaltar que o recomendado em documentação é o uso da API LottieAnimationView. São raros os casos onde a LottieDrawable poderá ser utilizada e a LottieAnimationView não. Eu particularmente me interessei pela LottieDrawable para utiliza-la junto a alguma Spanned String, pois sei que é possível colocar drawables nesse tipo de String. Porém em meus testes foi constatado que um drawable animado não é carregado em uma Spanned String. Se você teve resultados diferentes, não deixe de comentar aqui no artigo deste conjunto de slides. A LottieDrawable é pouco documentada e a maioria dos códigos utilizando ela, e disponíveis na comunidade Android, são códigos depreciados. Quando realizei os testes a invocação LottieComposition.Factory.fromAssetFileName() era apresentada como depreciada, mas foi o único exemplo válido encontrado. Logo, prefira o uso da LottieAnimationView, pois, em minha opinião, há fortes indícios de que a LottieDrawable não continuará como uma entidade pública. Uma informação importante para aqueles que tentarão a LottieDrawable é que: ao final do processamento, quando a animação não é mais útil, o método recycleBitmaps() deve ser invocado, pode ser até mesmo no onDestroy() da atividade host da animação.
  • 38. KeyPath para a animação de partes separadas Um arquivo de animação gerado via After Effects junto ao Bodymovin, esse arquivo tem uma estrutura JSON hierárquica onde o todo se chama Composition e os objetos que integram o todo são denominados Layers. Cada layer, camada, tem um nome e pode ser atualizado de maneira independente. A seguir um LottieAnimationView que ainda não passou por nenhuma atualização independente de layer:
  • 39. Executando o projeto com o simples LottieAnimationView anterior, temos: Clique aqui para abrir a animação
  • 40. Agora o código onde modificaremos as cores das montanhas da animação de fotografia:
  • 41. Para a aplicação de animação em layer, o método addValueCallback() deve ser utilizado, com os parâmetros: • KeyPath: que permite identificar, pelo nome, os layers que serão atualizados. A chave "**" indica a correspondência para zero ou mais layers. Para a definição de cor não foi possível colocar mais de um layer por método addValueCallback() e sempre, como último argumento em KeyPath, é necessária a definição de "**"; • Property: que identifica a propriedade que será atualizada nos KeyPaths indicados em primeiro argumento. Aqui definimos que a propriedade de cor é que será atualizada, LottieProperty.COLOR_FILTER. Em Animatable Properties há todas as propriedades passíveis de atualização independente; • Callback: instância que contém a configuração de atualização da propriedade definida em segundo argumento. Tem que ser uma LottieValueCallback. Os termos "Mountain front" e "Mountain back" foram encontrados no arquivo JSON de animação. Os nomes dos layers de sua animação estão sempre nas chaves nm.
  • 42. Executando o projeto Android com o código anterior de atualização de layer, temos: Clique aqui para abrir a animação
  • 43. Agora a atualização de posicionamento da montanha de trás, a montanha azul: Note que diferente da animação da propriedade de cor, aqui não precisamos da chave "**" para que a atualização ocorra. Eu sei, isso é um pouco estranho, mas acredite, descobri isso na "martelada", pois a documentação sobre KeyPath na doc oficial da Lottie API é bem simples, não diz muito em termos de código.
  • 44. Executando o projeto com novo algoritmo, temos: Clique aqui para abrir a animação
  • 45. Mais opções de configuração A seguir mais algumas opções de configuração que podem ser acessadas, algumas também podem ser atualizadas, além das já apresentadas até aqui. Note que todas as configurações a seguir somente retornarão valores válidos se forem invocadas depois de a animação já estar renderizada em tela. Segue:
  • 46. Muitas das configurações apresentadas no slide anterior são bem especificas para aqueles profissionais que têm um conhecimento mais apurado sobre as necessidades das animações em uso, por exemplo: a propriedade useHardwareAcceleration que permite um developer com expertise em animação tomar decisões de processamento com base no valor retornado desta entidade.
  • 47. Tamanho (altura x largura) da animação As animações criadas com o After Effects e exportadas com o plugin Bodymovin são animações vetoriais, ou seja, não há necessidade de criar animações com exacerbadas largura e altura. A documentação oficial da Lottie API recomenda que as animações, quando o maior tamanho possível é necessário, sejam criadas nas dimensões 411px x 731px, pois a Lottie API transformará esses valores em DPs. De qualquer forma, caso você tenha problemas com a cobertura da animação em tela, lembre que LottieAnimationView herda de ImageView e assim é possível utilizar com sucesso o atributo android:scaleType com os valore centerInside ou centerCrop.
  • 48. Pontos negativos • A documentação não está atualizada ao menos em relação a versão mais atual da API na época da construção deste conteúdo, a versão 2.6.0-beta19; • Não há um mínimo exemplo funcional com a LottieDrawable. Se essa API não tem tanta importância assim ela poderia ser removida; • Os exemplos com KeyPath, animação independente de layer, também são escassos.
  • 49. Pontos positivos • As animações podem ser invocadas com poucas linhas de código, exigindo um mínimo apenas em código XML, facilitando a construção do projeto; • Todo o trabalho de carregamento e gerência de animação em cache já é realizado pela própria API; • A herança do ImageView facilita em muito o enquadramento da animação em tela, quando necessário; • A possibilidade de carregamento de animação em servidor remoto é outro ponto de destaque. Como código extra somente temos de definir a permissão de Internet.
  • 50. Conclusão Animações, sem sombra de dúvidas, trarão maior profissionalismo ao seus projetos Android. A Lottie API permitirá que você consiga isso sem muito esforço. Somente tome cuidado com a quantidade de animações carregadas em tela, pois em testes realizados foi constatado que quanto mais animação em tela, maior a necessidade de processamento e menos responsivo fica o aplicativo, afetando diretamente a experiência do usuário. Lembre que caso você não tenha um artista de animações After Effects ao seu lado e também não tenha expertise em criação de animações com este software, você tem o site LottieFiles que certamente, junto a configurações LottieAnimationView, lhe permitirá obter o máximo de animação em seu domínio de problema.
  • 51. Tutorias para criação de animações no After Effects Caso você como desenvolvedor Android queira arriscar no aprendizado de animações no Adobe After Effects, a seguir deixo alguns tutoriais que poderão lhe ajudar com isso: • Tutorial BÁSICO de ANIMAÇÃO | After Effects; • COMO FAZER 5 ANIMAÇÕES INCRÍVEIS no AFTER EFFECTS com SHAPES!; • After Effects-Animação simples; • Tutorial Swift iOS: Exportando animações do After Effects com Bodymovin e Lottie; • Instalação e configuração do Lottie no After Effects.
  • 52. Fontes Conteúdo completo, em texto e em vídeo, no link a seguir: • https://www.thiengo.com.br/lottie-api-para-animacoes-no-android Fontes: • http://airbnb.io/lottie/ • https://medium.com/airbnb-engineering/introducing-lottie-4ff4a0afac0e • https://share.atelie.software/a-nova-era-de-anima%C3%A7%C3%B5es- mobile-com-lottie-3c0bca980782 • https://medium.com/blog-do-mitrut/suas-uis-animadas-com- lottie-431c4176623e
  • 53. Para estudo • Treinamento oficial: • Prototipagem Profissional de Aplicativos Android. • Meus livros: • Receitas Para Desenvolvedores Android; • Refatorando Para Programas Limpos. • Redes: • Udemy; • YouTube; • Facebook; • LinkedIn; • GitHub; • Twitter; • Google Plus. • Blog App.
  • 54. Lottie API Para Animações no Android thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com