Animated API
React Salvador Meetup #14
@pedrorosarioo
Quem somos nós?
Dia de conscientização sobre o autismo
Sanar: trazer conhecimento na área de saúde por um preço acessível
Núcleo em que trabalho: Residência Médica
Objetivo: ajudar o aluno de Medicina a ser aprovado na prova de residência (se tornar um especialista)
Já impactamos mais de 50 mil médicos em todo o Brasil
Existem cursos preparatórios na concorrência que chegam a valores de R$ 16 mil reais (cursos bi-anuais).
Extensivo Sanar: R$ 1800.00 (curso com duração de 1 ano)
Intensivo Sanar: R$ 1000.00 (curso com duração de 6 meses)
Somos uma empresa que incentiva a diversidade e a autonomia
Nossos produtos
Plataforma de cursos online
App de questões
E muitas dashboards para controle...
Alguns dados do nosso o app
48 mil usuários registrados
102 mil questões para o usuário responder
18 mil comentários em questões
Mais de 5 milhões de respostas registradas
E tudo isso de forma 100% gratuita
Tecnologias que utilizamos
React
React-Native
Styled components
Redux
Redux-Saga
Typescript
Graphql (Apollo)
NodeJS
Jest
MongoDB
Interessa?
jobs.kenoby.com/sanar
Por que usar animações?
Por que usar animações?
- Causam impacto visual
- Melhoram de forma direta a UX
- Facilitam o entendimento da aplicação
- Viabilizam features
- Trazem ao usuário a sensação de fluidez no app
"Animations are important in order to create an optimal user experience, especially in the mobile world. App users have been exposed to a lot of them already, and have become familiar with their usability and beauty. And since they have hands-on experience with them, they expect them as a given in every single app they download."
Marousas, 2018. [3]
Por que usar animações:
Dica
Por que usar animações:
Erros "elegantes"
Por que usar animações:
Indicador de ação
(ou simples distração)
Por que usar animações:
Shared Element Transitions
Por que usar animações:
Chamar a atenção
Por que usar animações:
Feature
Animações x React Native
X
Animações x React Native
SOLUÇÕES:
- LayoutAnimation: Permite a construção de animações globais, que serão aplicadas a todos os componentes envolvidos na proxima renderização.
- Animated: Oferece um controle de forma mais granular, permite manipular valores de variáveis de forma específica
Animated
- Animações fluidas, poderosas e fáceis de manter
- Focada em relações declarativas entre inputs e outputs
- Voltada para o controle interativo de valores específicos
- Consiste em construir animações por meio da manipulação de componentes e valores animados.
- Métodos start() e stop() para iniciar e parar as animações
Animated.Value
- Valor (classe) que será passado como parâmetro da animação
- Pode controlar múltiplas animações de forma sincronizada
- Só pode atender a uma função de animação por vez
- Usar uma nova função de animação ocasiona a parada de todas as anteriores que fazem seu uso
- Possui uma série de métodos que facilita a construção de animações
Animated.Value
Vejamos como funciona no codigo!
Configurando animações
- Animated.timing: manipula um valor em função do tempo.
- Animated.spring: manipula um valor com base em um modelo fisico de mola simples
- Animated.decay: começa com uma velocidade inicial e gradualmente diminui (com base em um coeficiente) até parar
Animated.timing(value, config)
Parâmetros:
- toValue: determina qual valor o parâmetro (value) deve apresentar quando a animação chegar ao fim;
- duration: determina em quanto tempo o parâmetro deve chegar ao valor final;
- easing: Easing function que define a curva de animação.
Default: Easing.inOut(Easing.ease) - delay: determina o tempo em ms que a animação, uma vez chamada, deve aguardar antes de iniciar.
- useNativeDriver: determina uso de driver nativo
Descrição:
Manipula um valor em função do tempo, baseando-se em uma curva facilitadora.
Animated.timing
Animated.spring(value, config)
Parâmetros:
- toValue: determina qual valor o parâmetro (value) deve apresentar quando a animação chegar ao fim;
-
tension: determina a velocidade inicial (tensão da mola).
Default: 40 - friction: controla o "bounciness" da mola (algo como o coeficiente elastico).
Default: 7 - speed: controla a velocidade da animação. Default: 12
- useNativeDriver: determina uso de driver nativo
- [...]
Descrição:
Manipula um valor com base em um modelo fisico de mola simples, ou de um oscilador harmônico.
Animated.spring
Animated.decay(value, config)
Parâmetros:
Descrição:
Começa com uma velocidade inicial e gradualmente diminui (com base em um coeficiente) até parar.
- velocity: Determina a velocidade inicial (tensão da mola)
- deceleration: Determina a desaceleração da animação
- useNativeDriver: determina uso do driver nativo
Animated.decay
Compondo Animações
Conjunto de funções que coordenam/encadeiam animações
- delay(time): Inicia uma animação após um determinado período (em ms).
- parallel(Animation[], config): Inicia um conjunto de animações ao mesmo tempo. Por default se uma das animações parar antes da hora, todas param. config = { stopTogether: true }
- sequence(Animation[]): Inicia um conjunto de animações em sequência, esperando a anterior terminar para iniciar a próxima
- stagger(time, Animation[]): Inicia um conjunto de animações em sequência, com um delay de time ms entre uma e outra
- loop(Animation): Faz com que uma determinada animação entre em um loop de repetição.
config = { iterations: -1 }
Valores combinados
Conjunto de funções que realizam operações aritméticas sobre valores animados
- add(Value, int | Value): Retorna a soma de um valor animado com um inteiro ou outro valor animado.
- sub(Value, int | Value): Retorna a diferença de um valor animado com um inteiro ou outro valor animado.
- multiply(Value, int | Value): Retorna o produto de um valor animado com um inteiro ou outro valor animado.
- divide(Value, int | Value): Retorna a razão entre um valor animado com um inteiro ou outro valor animado.
- modulo(Value, int | Value): Retorna o resto da divisão entre um valor animado com um inteiro ou outro valor animado.
Value.interpolate(config)
Função que, dado um range de entrada (inputRange) e um vetor de saída (outputRange), retorna uma interpolação linear dos dois.
Usado quando se deseja sincronizar valores que crescem de formas muito diferentes (Ex: opacity e translateY).
Value.interpolation(config)
É possivel inserir utilizar multiplas segmentações nos vetores
Value.interpolation(config)
Suporta o uso de strings e valores em outras unidades, permitindo fazer interpolação entre inteiros e cores, ou graus (deg)
Value.interpolation(config)
Parâmetros:
- inputRange: range de entrada (referente ao Value que invoca a função).
- outputRange: range de saída
- extrapolate: Como a interpolação se comporta caso o valor animado se encontre fora do range mapeado (tanto pela esquerda quanto pela direita)
- extrapolateLeft: Como a interpolação se comporta caso o valor animado se encontre à esquerda do range mapeado (seja menor)
- extrapolateRight: Como a interpolação se comporta caso o valor animado se encontre à direita do range mapeado (seja maior)
Animated.event([mapping], config)
-
Gestos como panning e scrolling, e outros eventos podem ser mapeados usando o Animated.event().
- Permite fazer com que o seu valor animado se torne um listener de um determinado dado do evento
Animated.event([mapping], config)
Parâmetros:
- mapping: mapeamento do evento. Por meio de configuração, navega por qualquer parâmetro do evento, e invoca a função setValue do valor animado passado (usando o parâmetro escolhido).
Animated.event([mapping], config)
Parâmetros de config:
-
listener: listener assíncrono opcional
- useNativeDriver: determina uso do driver nativo
useNativeDriver
- Parâmetro presente no objeto de configuração de boa parte das animações disponíveis na Animated API
- Solução trazida de um esforço coletivo entre a equipe de desenvolvimento da Expo e a comunidade
- Propõe resolver problemas de performance, utilizando o driver nativo (UI Thread) para cuidar das animações, sem a necessidade de usar a bridge a cada frame
useNativeDriver
Vejamos como funciona...
useNativeDriver: false
- JS: O driver de animação executa a função requestAnimationFrame e atualiza o valor com base na curva de animação (para cada frame).
- JS: Valores intermediários são calculados e passados pra um objeto/componente (node) de propriedades, que é associado à View.
- JS: A view é atualizada usando o metodo setNativeProps.
- View é serializada, seus dados passam pela bridge e chegam à UI Thread.
- Native: UIView ou android.View é atualizada.
useNativeDriver: false
useNativeDriver: true
O que o useNativeDriver faz é deixar que o nativo realize a maior parte dos passos. Ao invés de passar as atualizações dos componentes pela bridge a cada frame da animação, o que se faz é passar um objeto serializado contendo todas as informações da animação, chamado nativeAnimatedModule. Desta forma, o lado nativo pode cuidar da animação diretamente na UI thread a cada frame.
useNativeDriver: true
1. Cria-se um node com as informações do valor que será animado
2. Cria-se um node de interpolação que dirá ao driver nativo como interpolar o valor
useNativeDriver: true
3. Cria um node de propriedade, informando ao driver nativo qual propriedade será atualizada na View
4. Conecta todos os nodes criados
5. Conecta as props com a view
useNativeDriver: true
5. Uma vez passados os passos anteriores, a etapa final da montagem do NativeAnimatedModule consiste em passar as informações de inicio da animação (qual curva será usada, qual valor será atualizado, quais serão os frames)
useNativeDriver: true
Nativo:
-
O driver nativo usa o CADisplayLink ou o android.view.Choreographer para extrair as informações e atualizar os valores baseando-se na curva de animação.
-
Valores intermediarios são calculados, passados pra um node de propriedades e associado à view nativa.
- A UIView ou android.View é atualizada.
DUVIDAS?
OBRIGADO PELA PRESENÇA!!
Referencias
[1] Duplessis, J. Using Native Driver for Animated. Disponível em: https://facebook.github.io/react-native/blog/2017/02/14/using-native-driver-for-animated, visitado em: jun, 2019.
[2] Facebook React Native docs. Animated. Disponível em: http://facebook.github.io/react-native/docs/animated.html, visitado em: jun, 2019.
[3] Marousas, T. Animations in React Native: how to achieve great performance. Disponível em: https://medium.com/building-with-react-native/animations-in-react-native-how-to-achieve-great-performance-and-tips-1x04-44fd43996428, visitado em: mai, 2019.
deck
By Pedro Jesus do Rosário
deck
- 447