2010-01-29 7 views
2

Comment créer un composant MXML personnalisé dans flex qui est basé sur un composant existant mais dessine une superposition sur ce composant existant dans certaines situations.Dessiner une superposition dans un composant flex personnalisé

Idéalement, le nouveau composant doit être basé sur (dériver de) le composant sortant afin que les occurrences du composant existant puissent être simplement permutées avec le nouveau.

J'ai essayé de surcharger updateDisplayList() dans le nouveau composant et de peindre la superposition en utilisant this.graphics. Cela a entraîné la superposition sous les enfants du composant existant. J'ai également essayé de faire le dessin en recevant un rendu-événement qui a conduit à des résultats similaires.

Lorsque la condition externe qui doit déclencher l'affichage de l'overlay change, j'appelle invalidateDisplayList() sur mon nouveau composant. Cela fonctionne pour déclencher le dessin pour les deux cas décrits ci-dessus. Le problème restant semble être de savoir comment dessiner au-dessus de tous les autres composants une fois qu'ils sont ajoutés.

L'exemple suivant devrait illustrer ce que j'ai essayé de faire; quand overlayEnabled a été fixé et a été appelé du composant méthode invalidateDisplayList(), le rectangle rouge peint se serait en arrière-plan ....

// NewComponent.mxml 
<ExistingComponent ...> 
    <mx:Script> 
    ... 

     public var overlayEnabled:Boolean; 

     override protected updateDisplayList(...) { 
      super.updateDisplayList(...) 
      if (overlayEnabled) { 
       var g:Graphics = this.graphics;  
       g.beginFill(0xFF0000, 0.5); 
       g.drawRect(0, 0, width, height); 
       g.endFill(); 
      } 
     } 
    ... 
    </mx:Script> 
</ExistingComponent> 

Aussi, ne hésitez pas à suggérer des approches différentes.

+0

est le modifier ok? – Patrick

Répondre

4

Vous devrez ajouter un DisplayObject pour vous superposer et assurer lorsque vous appelez updateDisplayList qu'il est placé au-dessus de l'autre.

 public var overlayEnabled:Boolean; 

     public overlayHolder:(whatever display object you want to use) 

     override protected updateDisplayList(...) { 
      super.updateDisplayList(...) 
      if (overlayEnabled) { 
       if (overlayHolder.parent != this){ 
       addChild(overlayHolder); 
       } else { 
        if (numChildren > 0) 
        setChildIndex(overlayHolder, numChildren-1); 
       } 
       var g:Graphics = overlayHolder.graphics;  
       g.beginFill(0xFF0000, 0.5); 
       g.drawRect(0, 0, width, height); 
       g.endFill(); 
      } else if (overlayHolder.parent == this) { 
       removeChild(overlayHolder); 
      } 
     } 

Edit: Une propriété que vous pouvez utiliser pour ajouter votre superposition à la liste d'affichage peut être le rawchildren:

package { 
    import flash.display.Graphics; 
    import flash.display.Sprite; 

    import mx.containers.VBox; 

    public class MyVBox extends VBox { 
     public var overlayEnabled : Boolean = true; 
     public var overlay : Sprite = new Sprite(); 

     public function MyVBox() { 
      super(); 
     } 

     protected override function updateDisplayList(unscaledWidth : Number, unscaledHeight : Number) : void { 
      super.updateDisplayList(unscaledWidth, unscaledHeight); 
      if (overlayEnabled) { 
       if (overlay.parent != this) { 
        rawChildren.addChild(overlay); 
       } else { 
        if (rawChildren.numChildren > 0) 
         rawChildren.setChildIndex(overlay, rawChildren.numChildren - 1); 
       } 
       var g : Graphics = overlay.graphics; 
       g.beginFill(0xFF0000, 0.5); 
       g.drawRect(0, 0, width, height); 
       g.endFill(); 
      } else if (overlay.parent == this) { 
       rawChildren.removeChild(overlay); 
      } 
     } 
    } 
} 
+0

Ok, je vois que vous allez ... Dans ce cas, ExistingComponent est basé sur une VBox. ainsi, il veut (a) mettre en page tout ce qui est verticalement ajouté avec addChild() et (b) il nécessite l'ajout de DisplayObject pour implémenter IUIComponent. (b) n'est pas trop mauvais; mais comment puis-je ajouter mon DisplayObject? – VoidPointer

+0

A dû faire un test, je suppose que vous ne pouvez pas utiliser une toile et à l'intérieur de votre VBox et la superposition? – Patrick

+0

C'est très prometteur ... Je suis sur la route et je ne peux pas l'essayer tout de suite. Ce n'est peut-être que lundi que je pourrai le vérifier, mais je vous le ferai savoir dès que possible. Merci de votre aide! – VoidPointer