Implémentation d'animation dans React Native

Une traduction de l'article a été préparée spécialement pour les étudiants du cours ReactJS / React Native-Developer .




Il est difficile d'imaginer une application mobile dans laquelle il n'y a pas d'animation. Les animations sur le Web sont généralement simples, si elles existent (maximum - une page en remplace une autre). Les animations dans les applications mobiles nécessitent une attention complètement différente.

CSS3 possède une API relativement simple qui vous permet de créer des animations simples. Mais dans React Native, vous ne disposez pas de cet outil. Oui, même si c'était le cas, ce ne serait pas suffisant.

Alors, que devez-vous savoir si vous travaillez avec React Native et que vous devez implémenter des animations à part entière?

React Native a un outil comme Animated, mais il semble intimidant ... au moins au début.

Il y a donc trois «groupes de choses» ou «blocs» si vous le souhaitez, que vous devez connaître afin de travailler avec l'animation.

Bloc 0: Le besoin de changement


Les animations sont un changement d'un état à un autre:

  • Transition de «caché» à «visible»;
  • Transition d'un cercle à un carré.

Pensez à ce qu'il faut montrer avant et après l'animation.
Pensez aux transitions et aux styles que vous devez changer pour cela:

  • L'objet doit-il apparaître avec un changement de transparence, ou doit-il simplement «tomber» d'en haut?
  • Le cercle doit-il simplement se transformer en carré, ou doit-il devenir un triangle au milieu du processus?


Bloc 1: Un état visuel appelé Animated.Value


D'un point de vue logique, n'importe quel composant peut être affiché ou caché - ce sont les significations de «vrai» et «faux», il n'y a pas de compromis. En tant qu'état, un affichage indiquant si l'objet est affiché comme étant vrai ou faux.

Dans une bonne interface utilisateur, les objets ne se cachent pas soudainement et n'apparaissent pas non plus soudainement. Ils apparaissent progressivement, aidant l'utilisateur à comprendre l'interface.
Ainsi, il devient clair que l'état visuel peut être quelque chose entre un vrai état et un faux état.

Comment ça?
Nous pouvons introduire une autre variable pour représenter une gamme d'états visuels. Nous avons besoin que ce soit un nombre, car quel que soit l'état logique que nous avons, les nombres nous aident à représenter des valeurs intermédiaires.

 this._shown = new Animated.Value(0); 


Alors que l'état logique peut être binaire (c'est-à-dire true ou false , 1 ou 0), l'état visuel est un nombre à virgule flottante.

Bloc 2: Transitions connues sous le nom de Animated.timing


Supposons qu'un composant soit masqué: cela signifie que l'état logique de ses paramètres de visibilité sera faux et que l'état visuel sera également 0,0. Mais que se passe-t-il lorsque nous voulons montrer un composant? L'état logique devrait devenir immédiatement vrai, tandis que l'état visuel devrait progressivement passer d'abord à 0,1, 0,2, ... et enfin complètement à 1,0.

Pour ce faire, nous avons besoin d'un moyen de dire à l'état visuel la transition vers 1.0.
Et il existe de telles façons. En fait, il y en a même quelques-uns.
La manière la plus simple est essentiellement:

 Animated.timing(this._shown, { toValue: 1, duration: 300, }).start(); 


Ici, nous disons Animated pour changer _shown en 1.0 dans l'intervalle de 300 ms.
Il existe d'autres transitions et façons d'organiser plusieurs transitions, mais nous pouvons maintenant utiliser Animated.timing .

Bloc 3: Pixels connus sous le nom d' Animated.View et interpolate


Nos transitions _shown entre 0.0 et 1.0 ne signifient rien si nous ne pouvons pas les voir. Alors, comment faisons-nous cela?

Nous devons en quelque sorte utiliser _shown pour définir la transparence du composant enfant.

Supposons que nous disposions de ce code avant de commencer à travailler avec des animations:

 <View style={{ opacity: this.state.shown ? 1 : 0 }}> <SomeComponent /> </View> 


Nous mettons la transparence à 0 lorsque nous masquons le composant et à 1 lorsque nous le montrons.

Pouvons-nous utiliser les Animated.Value et _shown existants pour animer la transition de 0 à 1 ?

Animation de style


Nous pouvons utiliser n'importe quelle valeur Animated.Value lorsque nous travaillons avec des styles.
Nous avons juste besoin de changer la View vue Animated.View , et maintenant nous avons ce qui suit:

 const opacity = this._shown; // This is an Animated.Value <Animated.View style={{ opacity: opacity }}> <SomeComponent /> </Animated.View> 


N'est-ce pas un article sur les animations? Pourquoi n'y a-t-il toujours pas de photos?



Encore une chose: l'interpolation


Ce mot semble effrayant, mais l'idée elle-même est assez simple. L'interpolation nous permet de maintenir un état visuel entre 0 et 1, mais donne la possibilité de «faire correspondre» quelque chose d'autre.

Disons que, au lieu de simplement créer un composant hérité, nous voulons que notre composant "abandonne par le haut". Et nous pouvons le faire en plaçant le composant caché 40 pixels plus haut et en animant son mouvement à la position souhaitée, lorsque l'état devient visible.

Nous pouvons «faire correspondre» nos valeurs de 0 à 1 avec des valeurs de -40 à 0 en utilisant l'appel d' interpolate habituel:

 const top = this._shown.interpolate({ inputRange: [0, 1], outputRange: [-40, 0], }); 


Cela créera une nouvelle valeur Animated.Value , dont la valeur sera de -40 à 0.
En d'autres termes, ce sera -40 lorsque _shown est 0 , -20 lorsque _shown = 0.5 et 0 lorsque _shown 1.0 .



Dark secret: avec interpolate vous pouvez également modifier les valeurs des couleurs et des degrés.

Conclusions:


  • L'état visuel est une valeur numérique, il doit refléter la transition d'un style à un autre.
  • Animated.Value vous permet de refléter la valeur numérique de l'état visuel.
  • Animated.timing peut être utilisé pour déplacer Animated.Value vers un autre nombre.
  • Animated.Value peut être utilisé pour les styles lors du remplacement de View par Animated.View .

L'interpolation vous permet de mapper une plage de Animated.Value à une autre, par exemple une plage de 0 à 1 une plage de 5 à 25 ou même une plage entre le noir et le vert.

Sources:


Dans cet article, nous avons rencontré les primitives de l'animation dans React Native et acquis une compréhension de l'idée de base. Vous trouverez ici des ressources pour vous aider à approfondir ce sujet:

Source: https://habr.com/ru/post/fr468851/


All Articles