Bonjour,
Je développe une petite appli de dessin en flex. Un peu comme dans MS Paint, l'utilisateur est amené à utiliser différents outils. Pour chaque outil, je fais en sorte d'afficher un curseur particulier (un crayon pour le dessin libre, une gomme pour effacer...). Par ailleurs, l'utilisateur peut choisir un niveau de zoom pour la zone de dessin (50%, 100%, page entière ...). Je précise que le dessin est "vectoriel" : mon modèle de données consiste donc essentiellement en une collection de "paths" (séries de points) qui correspondent aux différents "traits" du dessin. J'ai donc recours à une transformation affine pour passer des points du modèle aux points de la vue (et vice versa).
Le cas qui me préoccupe est celui du curseur de la gomme : pour l'instant j'utilise une classe de ce type :
(l' IconBundle est juste un resource bundle qui renvoie les icônes de mon projet)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class EraserToolIcon extends Sprite { public function EraserToolIcon() { graphics.clear(); graphics.lineStyle(1, 0x000000); graphics.drawRect(-5, -5, 11, 11); var iconClass:Class = IconBundle.getIcon("util.eraser"); var iconImpl:DisplayObject = new iconClass(); iconImpl.x = 0; iconImpl.y = 0; addChild(iconImpl); } } }
Mon problème, c'est que le rectangle qui apparaît sous le dessin de la gomme et qui est censé montrer à l'utilisateur la délimitation de la zone qui va être effacée est défini dans le repère de la vue. Cela signifie donc que, vis à vis des points du modèle, la gomme devient plus "précise" si le zoom augmente. Je voudrais, à l'inverse, que le rectangle ait une taille dépendante du niveau de zoom actuel (c'est-à-dire une taille constante dans le repère du modèle).
J'ai bien essayé d'utiliser un Sprite simple pour le rectangle et qui "suivrait" les mouvements de la souris mais après quelques tests, je me suis rendu compte qu'il y avait beaucoup trop de décalage (le rectangle prend parfois un peu de retard et ça se voit).
J'ai vite écarté la solution peu élégante consistant à développer plusieurs classes EraserToolIcon50, EraserToolIcon100, EraserToolIcon200 qui correspondraient aux différents niveaux de zoom possibles car elle ne permet évidemment pas de gérer le cas du zoom "pleine page".
Le problème revient donc à essayer de passer un paramètre à l'instance de EraserToolIcon créée par le CursorManager. Pour cela, j'ai pensé créer une classe dont l'unique but serait de stocker la valeur courante du zoom (problème évident à terme si je décide d'avoir plusieurs zone de dessin).
Ma question est donc la suivante : y a-t-il un moyen de "paramétrer" la construction d'un curseur par le CursorManager autre qu'en utilisant une variable globale ?
Question subsidiaire : pourquoi n'ont-ils pas fait comme pour l'itemRenderer d'une liste qui prend en paramètre une ClassFactory pour laquelle on a au moins la possibilité de spécifier des propriétés ?
Merci d'avance,
Pierre.
Partager