2008-12-19 3 views
3

Notre application Flex est automatiquement redimensionnée avec la fenêtre du navigateur. Nous avons abordé tout un tas de problèmes de mise à l'échelle assez facilement, mais il ne reste plus que des infobulles. Ils s'affichent au mauvais endroit sur l'écran, n'étant pas mis à l'échelle correctement en fonction de la taille de la fenêtre. Puisque les info-bulles sont positionnées automatiquement, comment pouvons-nous y remédier?Positionnement de l'info-bulle dans une application redimensionnable

Pour clarifier j'utilise les infobulles flexibles intégrées. Et le problème n'est pas que les infobulles ne bougent pas lorsque l'application se redimensionne quand elles sont affichées. C'est que si je redimensionne l'application, les infobulles seront maintenant affichées au mauvais endroit, même si tout le reste se met à jour automatiquement correctement.

+0

utilisez-vous les info-bulles intégrés ou votre propre? – PEZ

Répondre

0

Je ne pense pas qu'il existe une excellente solution à ce problème depuis le ToolTipManager ne sait pas quand le currentTarget pour un ToolTip change d'emplacement sur la scène. Le correctif doit à peu près aller dans le cadre Flex lui-même. J'ai bricolé ensemble quelque chose qui semble fonctionner, mais cela nécessite de monkeypatching le cadre Flex.

  1. Copie mx.managers.ToolTipManager.as dans votre projet dans un package mx.managers vous créez.

  2. Ajoutez cette méthode en bas du fichier.

    public static function positionToolTip() : void { 
        ToolTipManagerImpl(impl).positionTip(); 
    } 
    
  3. Appelez cette méthode sur l'événement de redimensionnement de votre application.

3

Je ne sais pas si vous avez trouvé une solution à celui-ci, mais il y a une approche plus simple. Ce code se connecte à l'événement tooltip-show, pendant la phase de capture (avant son affichage), pour le mettre à l'échelle et le positionner correctement en fonction de l'échelle de l'élément conteneur - dans ce cas, le document parentApplication. Il comprend également un peu de code qui, dans mon cas, a contribué à maintenir les info-bulles à la dérive de la scène lorsque l'échelle (vous pourriez seulement avoir besoin les premières lignes - t.scaleX et t.scaleY):

import mx.events.ToolTipEvent; 

addEventListener(ToolTipEvent.TOOL_TIP_SHOW, handleToolTipShow, true, 0, true); 

private function handleToolTipShow(event:ToolTipEvent):void 
{ 
    if (event && event.toolTip) 
    { 
     var t:IToolTip = event.toolTip; 

     // Scale the tip itself 
     t.scaleX = this.scaleX; 
     t.scaleY = this.scaleY; 

     // Scale the offsets 
     var xOffset:int = 10 * this.scaleX; 
     var yOffset:int = 10 * this.scaleY; 

     // Set the default positioning 
     t.x = parent.mouseX + xOffset; 
     t.y = parent.mouseY + yOffset; 

     // Set the adjusted height and width 
     var th:Number = t.height * this.scaleX; 
     var tw:Number = t.width * this.scaleY; 

     var rightEdge:int = t.x + tw + xOffset; 
     var playerRightEdge:int = parent.width; 
     var bottomEdge:int = t.y + th + yOffset; 
     var playerBottomEdge:int = parent.height; 

     // Offscreen right 
     if (rightEdge > playerRightEdge) 
     { 
      t.move(parent.mouseX - xOffset - tw, parent.mouseY + yOffset); 
     } 

     // Offscreen bottom 
     if (bottomEdge > playerBottomEdge) 
     { 
      t.move(parent.mouseX + xOffset, parent.mouseY - yOffset - th); 
     } 
    } 
} 
0

Essayez de convertir les coordonnées à l'aide globale contentToGlobal()