Animation : modification de rayons

Dr_cubeDr_cube Membre
août 2008 modifié dans API AppKit #1
Salut tout le monde !

C'est mon premier message sur ce forum ! Je suis débutant en Cocoa et je développe une application sur iPhone depuis deux mois environ, dans le cadre d'un stage de fin de 2ème année d'école d'ingénieur.

J'ai un petit problème avec les animations... J'espère que vous pourrez m'aider. J'espère aussi que je poste au bon endroit parce que plusieurs forums semblaient appropriés pour mon problème. J'ai choisi "couche graphique" parce que je pense que mon problème n'est pas spécifique à  l'iPhone.


Voici mon problème :

- Je dois respecter un schéma MVC assez stricte.

- Je n'utilise pas IB.

- J'ai une hiérarchie de vues personnalisées qui dessinent des anneaux circulaires imbriqués avec du texte et/ou des images dedans (chaque anneau contient plusieurs sous-vues).

- Je veux faire une méthode qui serait capable d'"ouvrir" ou "fermer" mes anneaux d'un ou plusieurs niveaux à  la fois. Le but étant par exemple de supprimer l'anneau le plus au centre, ou d'en faire apparaà®tre un nouveau à  partir du centre en poussant les autres vers l'extérieur.

- Le problème c'est que je me perds un peu avec les animations.. Je n'arrive pas à  animer le changement de rayon des anneaux.

- J'ai essayé de redimentionner la vue de chaque anneau en calculant le bon facteur de rétrécissement ou d'agrandissement afin de simuler le changement de rayon, mais deux problèmes subsistent : Une fois redimentionné, c'est moche ; si les anneaux sortaient de l'écran, les parties rognées ne sont pas redessinées pendant et après l'animation.

- D'après ce que j'ai compris, si je fais une animation sur le layer associé à  la vue (et dans ce cas je déplace tout ce qu'il y a dans le drawRect de la vue dans le drawLayer:inContext), alors je peux faire un setDelegate sur l'animation, et définir une classe (par exemple la vue courante) déléguée qui implémente animationDidStop et animationDidStart. J'aimerais pouvoir utiliser animationDidStop pour être certain que l'animation est terminée, et pouvoir supprimer de la hiérarchie de vues l'anneau qui est le plus au centre (et qu'on ferme dans le cas d'un rétrécissement).

Est-ce que, du haut de votre expérience en graphisme dans Cocoa, vous pourriez m'aider à  réaliser cette animation ? Je ne sais vraiment pas comment m'y prendre et j'ai essayé pleins de trucs (animation avec des UIView, CABasicAnimation, CATransition) et ça ne fait jamais ce que je veux.


Merci beaucoup pour votre aide et pour votre patience ! :)

Réponses

  • Philippe49Philippe49 Membre
    11:12 modifié #2
    Je joins un fichier sur les animations simples d'une vue sans intervention de CoreAnimation. Les propriétés "animatable" d'une vue sont dans la doc.
  • Dr_cubeDr_cube Membre
    août 2008 modifié #3
    Merci Phil. J'ai bien regardé ton code, mais je sais faire ce genre d'animation de base.

    J'ai avancé un peu, mais je suis toujours coincé donc je reformule mon problème :

    - J'ai toujours mes anneaux concentriques que je veux rétrécir dans une belle animation.
    - Je supprime l'anneau le plus au centre en le faisant réduire au maximum tout en disparaissant.
    - Par contre je veux réduire légèrement chacun des anneaux les plus extérieurs (pour combler le vide de l'anneau supprimé). Il y a dès lors deux problèmes :
    - Si un anneau ne rentrait pas en entier sur l'écran, il reste rogné lors de l'animation. Je n'arrive pas à  résoudre ce problème.
    - Je sais faire une réduction avec les bounds des layers, mais mes anneaux ont tous la même épaisseur quel que soient leurs rayons, et avec une telle animation ils sont beaucoup plus fins à  la fin, ce qui ne me convient pas.

    J'aimerais donc créer une animation qui anime la réduction du rayon de mes anneaux (le rayon est une propriété que j'ai ajouté dans ma classe RingView qui hérite de UIView), et redessiner avec drawRect: ou drawLayer:InContext: à  chaque pas de l'animation. Cela résoudrait d'un seul coup mes deux problèmes !
    Mais je n'arrive pas à  trouver comment créer ce genre d'animations très personnalisées. Il s'agit très certainement d'une animation classique (avec une boucle de rendu), mais je ne sais pas faire. Est-ce que quelqu'un peut me mettre sur une piste ? Je ne trouve rien pour m'aider dans la doc d'Apple ou sur le Web. C'est assez urgent, et je cherche en vain depuis des jours :(..

    Merci infiniment pour votre aide !
    J'offre un bonbon à  celui qui saura me mettre sur la voie !
  • Philippe49Philippe49 Membre
    11:12 modifié #4
    Tu as vu ce post qui attire l'attention sur les sous-classes de NSAnimation
  • Dr_cubeDr_cube Membre
    août 2008 modifié #5
    C'est exactement ce que je veux faire ! Mais par contre NSAnimation n'existe pas dans l'iPhone ! Je pensais que l'équivalent était CAAnimation, mais c'est beaucoup plus limité, et il n'y a pas de setCurrentProgress à  redéfinir...

    Au secours  :why?: :'(

    Edit : j'ai relu toute la doc iPhone sur les animations. Il n'y a rien en dehors de Core Animation. Je ne trouve pas comment animer autre chose que des propriétés de layer.
    Je pense donc que la meilleure solution est de faire une boucle de rendu manuellement, mais je ne sais pas comment on fait ;_;.
  • Philippe49Philippe49 Membre
    11:12 modifié #6
    Une autre piste à  explorer :
    iPhone Dev Center > iPhone Reference Library > Topics > Graphics & Animation: Animation > Animation Types and Timing Programming Guide >
    La property  "timing Function" est sans doute intéressante.

    Pour Core Animation, ces pages peuvent peut-être t'aider ...

    Filter_Frame_Animation
    et Actions

  • 11:12 modifié #7
    Y'a un eBook payant/téléchargeable sur internet qui propose de faire ses premiers pas avec CoreAnimation. J'ai trouvé ça intéressant je pense que t'y verras plus clair avec. CoreAnimation permet vraiment pas mal de choses
  • Dr_cubeDr_cube Membre
    août 2008 modifié #8
    Phil : je regarde ta doc. Je l'ai déjà  lu mais j'étais resté sur l'idée que ça ne marchait que pour les propriétés animatables des layers. Je vais relire en détails le truc pour m'en assurer.

    Eaglelouk : Tu peux me filer le lien vers le site qui propose cet eBook ? J'ai pas envie de prendre le mauvais bouquin...


    Edit : j'adore les expressions qui ont été utilisé pour décrire l'ancienneté des membres : torréfacteur, artisan chocolatier ^^. C'est super bien trouvé ^^.
  • 11:12 modifié #9
    Aà¯e malheureusement je ne l'ai plus du tout en tête, ni sur mon ordinateur. En tout cas c'est tout en anglais, donc j'espère que tu aimes ça  :o
  • Philippe49Philippe49 Membre
    11:12 modifié #10
    Perso, j'avais essayé de me procurer la version papier de "Core Animation For OS X" de Bill Dudney, mais l'édition a été repoussée. Il y a une version PDF en beta, que je n'ai pas lue.  Le Site
  • 11:12 modifié #11
    Voilà  me semble que c'est bien ça, car dedans ils parlaient justement que cet eBook était un brouillon
  • Philippe49Philippe49 Membre
    11:12 modifié #12
    dans 1219010005:

    Perso, j'avais essayé de me procurer la version papier de "Core Animation For OS X" de Bill Dudney, mais l'édition a été repoussée. Il y a une version PDF en beta, que je n'ai pas lue.  Le Site

    Bon ben voilà , j'ai parcouru en diagonale le pdf : un bon livre d'initiation, avec un commentaire très développé. Les exemples (code dispo sur le site) me semblent plus simples (du niveau de ce qu'il dans le Core Animation Programming Guide) que ceux que j'ai présentés sur le site Core Animation, sans contenir les réponses que j'ai laissées en suspens sur ces pages ...
Connectez-vous ou Inscrivez-vous pour répondre.