2009-05-13 9 views

Répondre

3

C'est exactement à ce point que j'ai réalisé à quel point certaines choses simples dans Flex peuvent être compliquées. :)

Il existe différentes façons de gérer un problème comme celui-ci en fonction de l'effet recherché, mais la façon dont je l'ai toujours fait est d'abord en remplaçant certaines fonctions de la TileList, puis en utilisant itemRenderers personnalisé . (Je n'ai jamais été capable de comprendre comment faire en sorte que l'objet graphique de la liste soit top du contenu rendu, cependant - quelqu'un d'autre pourrait être en mesure de faire la lumière là-dessus.)

Par exemple , Je vais généralement créer une nouvelle classe qui étend TileList, puis remplacer les méthodes chargées de dessiner les indicateurs de surbrillance et de sélection pour obtenir un peu plus de contrôle sur la façon dont ces fonctions dessinent les indicateurs (ou parfois je vais commenter leur contenu tout à fait, de sorte que rien ne se dessiné):

public class MyCustomTileList extends TileList 
{ 
    public function MyCustomTileList() 
    { 
     super(); 
    } 

    override protected function drawHighlightIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void 
    {   
     var g:Graphics = Sprite(indicator).graphics; 
      g.clear(); 
      g.beginFill(getStyle("myRolloverColor"), getStyle("myRolloverAlpha")); 
      g.drawRect(1, 1, width - 1, height - 1); 
      g.endFill(); 

      indicator.x = x; 
      indicator.y = y; 
    } 

    override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void 
    { 
     // 
    } 
} 

Mais comme vous le dites, puisque l'objet graphique semble toujours dessiner derrière le contenu de l'élément de la liste, je vais opter généralement d'utiliser un moteur de rendu d'élément pour dessiner quelque chose (par exemple, une boîte translucide) au-dessus de l'image associée à mon élément de données:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"> 

    <mx:Script> 
     <![CDATA[ 

      private function img_rollOver():void 
      { 
       highlight.visible = true; 
      } 

      private function img_rollOut():void 
      { 
       highlight.visible = false; 
      } 

     ]]> 
    </mx:Script> 

    <mx:Image id="img" source="{something}" horizontalCenter="0" verticalCenter="0" buttonMode="true" useHandCursor="true" mouseChildren="true" rollOver="img_rollOver()" rollOut="img_rollOut()" /> 
    <mx:Box id="highlight" alpha="0.1" color="#FFFFFF" horizontalCenter="0" verticalCenter="0" width="{img.width}" height="{img.height}" buttonMode="true" useHandCursor="true" mouseChildren="true" rollOver="img_rollOver()" rollOut="img_rollOut()" visible="false" /> 

</mx:Canvas> 

Je suis sûr il y a d'autres approches, mais celle-ci fonctionne plutôt bien pour moi, et je trouve généralement d'autres avantages à sous-classer les commandes flex de stock.

J'espère que ça aide!

+0

Merci, j'ai une question cependant, pourquoi la fonction de constructeur ne correspond pas à votre nom de classe? –

+0

Parce que je suis un dork. :) J'ai copié un peu de code, c'est tout. Fixé. (Merci de noter!) –

+0

L'objet graphique est toujours derrière les enfants d'un objet d'affichage. Il n'y a aucun moyen de changer cela. Personnellement, je créerais votre deuxième approche en ActionScript plutôt qu'en MXML car vous pouvez utiliser un objet Forme ou Sprite primitif pour la surbrillance. Pourquoi utiliser une boîte, qui inclut toutes sortes de logique de disposition de conteneur dont vous n'avez pas besoin? La surutilisation des conteneurs inutiles est l'un des plus importants drains de performance dans les applications Flex. Le rendu d'élément ne doit pas non plus être basé sur Canvas, sauf si vous avez spécifiquement besoin de barres de défilement. – joshtynjala

1

Pensé à l'aide d'une bordure, en remplissant l'image par 2px? Une autre alternative qui vient à l'esprit est le positionnement absolu ...

0

Je pense qu'il est plus facile de désactiver les effets de sélection et de surbrillance, puis de créer ce que vous attendez dans le moteur de rendu. Les données pour le moteur de rendu devront avoir une sorte de propriété .selected dedans. Le moteur de rendu peut alors lier ou répondre aux changements de son data.selected (ou quelque chose de similaire) et mettre à jour son apparence comme bon vous semble.

Je n'utilise que les visuels par défaut sur la liste quand je n'ai pas d'autre choix. Je ne voudrais jamais essayer d'étendre List (bien que, bon code Christian).

Questions connexes