Bonjour,

j'essaie de reproduire un graph boursier tel que celui ci : clic !

J'essaie notamment d'implémenter les boutons "zoom+" et "zoom-" que l'on voit en bas du grap et permettant d'afficher plus ou moins de données. Idem pour la scrollBar permettant ensuite de se déplacer dans un sous ensemble du dataProvider initial du graphique. Sur le graph ci-dessus, tout est fluide.

Par contre, de mon coté et après avoir implémenté les fonctions ci dessus, mon graph met énormément de temps à s'afficher. Idem lorsque je zoome ou que je me déplace avec ma scrollBar.

Basiquement, voici comment je m'y suis pris pour les fonctions zooms :

j'ai stocké mon dataProvider sous forme de tableau dans une propriété afin d'y accéder plus rapidement qu'un ArrayCollection. J'ai un Point (une autre propriété) dans lequel je stocke les propriétés x et y correspondant aux indices de mon dataProvider initial (maintenant stocké sous forme de tableau) qui me permet de savoir la "portion" du dataProvider initial affiché par le graphique.

Voilà une partie de code pour la fonction "zoom-" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
var toCheckIn:uint = Math.min(toolBar.stepChooser.value, _initialDataAsArrayLength - subArrayLength);
 
					if(toCheckIn == 0)
						return;
 
					// Si l'espace entre l'index Y et la fin du tableau en longueur est suffisant pour ajouter autant de valeur que de toCheckIn, alors on ajoute tout à droite
					// Sinon on ajoute à droite (si on peut) un maximum d'items puis à gauche
 
					if((_initialDataAsArrayLength - _indexesDisplayed.y) >= toCheckIn)
					{trace("cas1");
						(chartRef.dataProvider as ListCollectionView).addAll(new ArrayList(_initialDataAsArray.slice(_indexesDisplayed.y+1, toCheckIn)));
						_indexesDisplayed.y += toCheckIn;
					}
					else if((_initialDataAsArrayLength - _indexesDisplayed.y) > 0)
					{trace("cas2");
						var toRight:uint = _initialDataAsArrayLength - _indexesDisplayed.y;
						(chartRef.dataProvider as ListCollectionView).addAll(new ArrayList(_initialDataAsArray.slice(_indexesDisplayed.y+1, toRight)));
						_indexesDisplayed.y += toRight;
 
						var remaining:uint = toCheckIn - toRight;
						(chartRef.dataProvider as ListCollectionView).addAllAt(new ArrayList(_initialDataAsArray.slice(_indexesDisplayed.x - remaining, remaining)), 0);						
						_indexesDisplayed.x -= remaining;
					}
else
					{trace("cas3");
						(chartRef.dataProvider as ListCollectionView).addAllAt(new ArrayList(_initialDataAsArray.slice(_indexesDisplayed.x - toCheckIn, toCheckIn)), 0);						
						_indexesDisplayed.x -= toCheckIn;
					}
En gros...tout marche bien sauf que c'est très lent

Je ne vois pas comment faire afin d'améliorer l'algo. J'ai donc choisi d'utiliser un sous dataProvider pour l'affichage dans lequel j'ajoute/supprime des éléments en fonction du zoom, du scroll mais sur une période de 10ans soit environ 2500 chandeliers, une action me prend plus de 10 secondes...

Le premier affichage est lent ok, mais les autres devraient être rapides à la manière du graph proposé ci dessus. J'ai donc probablement pas le bon algo^^

Si quelqu'un aurait une idée...

Merci