2 votes

Vitesse de défilement de la liste avec la molette de la souris

J'ai une classe personnalisée qui étend List et que j'utilise comme conteneur. Cependant, la vitesse de défilement est trop rapide sur la molette de la souris, c'est-à-dire qu'il y a des charges de défilement même si vous ne bougez la molette que très peu. J'ai essayé d'ajouter un écouteur d'événement à ma liste pour MouseEvent.MOUSE_WHEEL et de régler la valeur de event.delta, mais cela n'a eu aucun effet. Quelqu'un sait-il comment ralentir le chargement ?

Ma classe personnalisée n'a rien de spécial, je l'ai juste créée pour avoir différents itemRenders pour différents types d'objets. Elle ressemble à ce qui suit :

public class MultipleRenderersList extends List
{
    override public function createItemRenderer(data:Object):IListItemRenderer
    {
        if (data is IRenderable)
        {
             return data.getDiaryRenderer();
        }
        else if (data is Array) 
        {
             if (data.length > 0)
             {
                  if (data[0] is IRenderable)
                  {
                       return data[0].getDiaryRenderer(data);
                  }
             }
        }
        return null;
    }
}

4voto

sean Points 2340

La classe List dispose d'une fonction mouseWheelHandler que vous pouvez remplacer. Il suffit de surcharger la fonction, de mettre à jour la propriété delta du mouseevent et d'appeler super. Cet exemple divise par quatre le delta, ce qui réduit considérablement la vitesse :

package
{
  import flash.events.Event;
  import flash.events.MouseEvent;

  import mx.controls.Alert;
  import mx.controls.List;

  public class MyList extends List
  {

    override protected function mouseWheelHandler(event:MouseEvent):void {
      event.delta = event.delta/4;
      super.mouseWheelHandler(event);
    }

  }
}

Cependant, dans de nombreux cas, la vitesse de défilement / le delta dépendent d'une préférence du système, ce qui peut entraîner un comportement inattendu pour certains utilisateurs. La raison pour laquelle l'ajout du gestionnaire et la mise à jour du delta n'ont pas fonctionné est que mouseWheelHandler avait déjà été appelé.

2voto

HandOfCode Points 29

Un moyen très simple de modifier cela est de changer la propriété verticalLineScrollSize. Il s'agit d'une propriété de tous les conteneurs, dont la valeur par défaut est de 5 (pour flex 3).

2voto

user1919265 Points 21

En fait, ce que HandOfCode n'est pas pertinent ici. Parce qu'il a fait la même erreur que moi, à savoir penser qu'un composant List ou un composant TileList sont des conteneurs. Ce n'est pas le cas. Ils n'ont donc pas la propriété verticalLineScrollSize.

Sean est la seule solution qui ait fonctionné dans mon cas. J'ajouterais que event.delta peut avoir une valeur positive ou négative en fonction de la direction de l'action de la roue. Il est donc préférable de faire quelque chose comme cela si vous prévoyez de faire défiler, par exemple, une ligne à la fois :

    override protected function mouseWheelHandler(event:MouseEvent):void
    {
        event.delta = (event.delta > 0) ? 1:-1;
        super.mouseWheelHandler(event);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X