Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/02/2012, 11h06   #1
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 279
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 279
Points : 2 327
Points : 2 327
Par défaut Scroller de manière fluide sur un chart

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 :
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
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h01.


 
 
 
 
Partenaires

Hébergement Web