Framework animation : un pas vers les interfaces modernes

Jonathan Courtois

Cet article est un résumé de la conférence Animation Framework : A Step Toward Modern UIs, réalisée par Thierry Bastian durant les Qt Developer Days 2009 à Munich.

N'hésitez pas à commenter cet article !
Commentez

- Titre : Framework animation : un pas vers les interfaces modernes

- Auteur : Jonathan Courtois

- Parution : 25 octobre 2009

- Mise à jour : 7 mai 2009

- Licence : Copyright ® 2009 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Qui est Thierry Bastian ?

- II. Pourquoi ce framework ?

- III. Architecture

- III-A. QAbstractAnimation

- III-B. QVariantAnimation

- III-C. QPropertyAnimation

- III-D. QAnimationGroup

- IV. La gestion de la mémoire

- V. Utilisation

- VI. États et transitions

- VII. Conclusion

I - Qui est Thierry Bastian ?

Thierry Bastian est un français diplômé en informatique à l'école d'ingénieur ESIAL de Nancy. Thierry a intégré Trolltech en 2006 et travaille depuis 4 ans en tant que développeur sur le framework Qt. Il fait partie de l'équipe « Widget » et passe la plus grande partie de son temps à travailler sur le multimédia, l'animation et les autres tâches liées aux widgets.

II - Pourquoi ce framework ?

La naissance du framework animation vient du besoin de simplifier la création d'animation dans les interfaces utilisateurs modernes en améliorant le support de ces dites animations dans Qt. Avant la création de ce framework, il était possible de réaliser des animations dans une interface graphique à l'aide du QTimer et du rafraîchissement régulier de l'application mais un tel développement été très fastidieux pour le programmeur. Ce framework fait donc son apparition dans le projet QtKinetic ainsi que dans la version 4.6 de Qt avec trois objectifs principaux :

- Bonne API d'animation,

- Développement d'animations simplifié,

- Performances.

III - Architecture

Figure 1 : Architecture du framework Animation

III-A - QAbstractAnimation

Il s'agit de la classe de base du framework qui gère complètement le timer et ses événements ainsi que la synchronisation avec les autres éléments. Il comporte tous les contrôles basiques d'une animation. À savoir : start, stop, pause.

Voici les propriétés principales de cette classe :

- loopCount : le nombre deboucles de l'animation ;

- duration : la durée de l'animation ;

- direction : le sens de l'animation (il est possible d'inverser très facilement la lecture de l'animation) ;

- currentTime : le temps courant de l'animation et la progression ;

Figure 2 : Propriétés de la classe QAbstractAnimation

III-B - QVariantAnimation

Cette classe est basée sur QVariant et hérite de QAbstractAnimation. Elle gère la valeur de départ (startValue) et de fin (endValue) d'une animation ainsi que les trames clés (key frames). Elle permet la gestion des interpolations linéaires (possibilité de créer ses propres interpolations) ainsi que des courbes assouplies (easingcurve). Dans le cas d'animations d'une classe non QObject, il est nécessaire de réimplémenter cette classe.

III-C - QPropertyAnimation

Cette classe est utilisée pour animer les propriétés dans Qt (QtProperties). Elle permet de travailler avec les propriétés d'un objet (autorise la gestion dynamique des propriétés) et c'est principalement cette classe que l'on va utiliser.

Code simple d'animation d'un bouton :

Code simple d'animation d'un bouton

QPushButton button("Animated Button");
button.show();
QPropertyAnimation animation(&amp;button, "geometry");
animation.setDuration(3000);
animation.setStartValue(QRect(0, 0, 100, 30));
animation.setEndValue(QRect(250, 250, 100, 30));
animation.setEasingCurve(QEasingCurve::OutBounce);
animation.start();

III-D - QAnimationGroup

Cette classe est un conteneur d'animations dans le cadre d'animation complexes. Elle permet de gérer des animations à la fois de façon séquentielle et parallèle en même temps (cf. ). La durée de l'animation est alors définie par le conteneur.

Figure 3 : Représentation des animations de groupe

La démo Animatetiles fournie dans les exemples de Qt est un bon exemple des animations parallèles. Chaque cercle est une animation jouée en parallèle des autres.

IV - La gestion de la mémoire

Les classes d'animation ont une relation parent-enfant avec QObject, ce qui permet une bonne gestion de la mémoire. Par exemple, les animations de groupes contiennent les animations internes au groupe ce qui permet la suppression automatique des objets enfants due à la règle de suppression en orienté objet.

V - Utilisation

Un développeur aura sûrement pour objectif d'animer des éléments dans un QGraphicsView. Cependant un QGraphicsView est composé de QGraphicsItem, qui ne possèdent pas de propriétés système, n'héritant pas de QObject. L'utilisation des QGraphicsItem devient alors un problème et son développement très ardu. C'est pourquoi il a été décidé d'arrêter le support de cette classe pour se concentrer sur les classes héritant de QObject, d'où l'apparition d'une nouvelle classe QGraphicsObject.

Pour le programmeur, 3 options s'offrent à lui pour réaliser des animations dans son interface graphique :

- L'utilisation de la nouvelle classe QGraphicsObject ;

- L'héritage d'une classe perso avec QObject ;

- L'utilisation des transformations avec QGraphicsTransform.

QGraphicsItem devient alors une classe dépréciée dans les futures versions du framework Qt. La classe QGraphicsTransform est à utiliser dans le cas d'objets complexes pour des effets de 3D (2,5 D plus exactement) étant donné que chaque QGraphicsItem possède une liste de QGraphicsTransform.

La meilleure solution pour l'animation est bien sûr l'utilisation de la nouvelle classe QGraphicsObject. Elle est la base commune de tous les nouveaux éléments graphiques et n'est rien d'autre que ce qu'aurait dû être QGraphicsItem depuis le début.

VI - États et transitions

Le framework de la machine à états (state machine) fait également partie du projet Qt Kinetic ainsi que de la version 4.6 de Qt. Il peut être utilisé en complémentarité avec le framework Animation. Chaque état permet de définir des propriétés telles qu'une position, une dimension, une rotation ou une opacité. Toutes les transitions entre états peuvent alors être animées grâce au framework Animation.

Figure 4 : Architecture de l'utilisation des animations avec la machine à états

VII - Conclusion

Le framework Animation fait maintenant partie de la version 4.6 de Qt. Il possède une très bonne intégration avec la machine à états également disponible depuis la version 4.6. L'animation d'objets et plus particulièrement de QGraphicsObject est une des bases des interfaces graphiques déclaratives. L'équipe du framework Animation travaille actuellement sur l'animation des gestionnaires de dispositions (layout) qui devrait être une future évolution de ce framework très prometteur.