2011-07-19 4 views
0

J'ai la configuration suivante:enfants de maintien de la taille fixe

<mx:Canvas> 
<mx:ViewStack width="800" height="600"> 

    <mx:Canvas width="100%" height="100%"> 
    <s:BorderContainer width="100%" height="100%"> 
    <mx:Canvas x="80" y="46" width="640" height="480"> 
     <custom:CustomComponent width="640" height="480" /> 
    </mx:Canvas> 
    </s:BorderContainer> 
    </mx:Canvas> 

</mx:ViewStack> 
</mx:Canvas> 

Le <custom:CustomComponent /> est quelque chose que je ne peux pas changer. C'est quelque chose qui affiche des vidéos. Cependant, pour une raison quelconque, quelque chose (un conteneur je suppose) obtient la taille 800 x 600. Donc, je reçois des barres de défilement à l'intérieur du <custom:CustomCompnent />.

Y a-t-il un moyen de forcer tous les enfants d'un certain conteneur à ne pas dépasser une certaine largeur/hauteur.

+0

La meilleure façon de savoir quel conteneur va au-delà de la largeur et la hauteur donnée, il suffit d'ajouter la couleur d'arrière-plan rouge, bleu, vert et ainsi de suite et exécutez votre application pour voir exactement quel composant est à l'origine de cette question. C'est un moyen simple de gérer ces problèmes. –

+0

Pourquoi utilisez-vous les composants MX * et * Spark? Tout ici peut être fait Spark. –

+0

Pour être honnête J_A_X, je n'ai pas la moindre idée de ce que je fais. Je sais que j'utilise Spark et MX mais je ne sais pas ce que c'est. J'essaye juste de bidouiller quelque chose ensemble qui a l'air correct et qui est rapide à faire pour une tâche d'école :) –

Répondre

2

Vous pouvez simplement remplacer la méthode addChildAt() de votre conteneur personnalisé. (ceci couvre aussi la méthode addChild(), car addChild() appelle addChildAt()). Là, vous pouvez vérifier la largeur et la hauteur et ajouter changeWatchers pour vérifier chaque fois que la largeur/hauteur d'un composant change. les changeurs de changement devraient être utilisés parce que DisplayObject n'a pas de propriété maxWidth/maxHeight (sinon ce serait encore plus facile).

override public function addChildAt(child:DisplayObject, index:int):DisplayObject 
{ 
    super.addChildAt(child, index); 

    if(child.width > 640)child.width = 640; 
    if(child.height > 480)child.height = 480; 

    ChangeWatcher.watch(child, "width", function():void{child.width = (child.width > 640) ? 640 : child.width;}); 
    ChangeWatcher.watch(child, "height", function():void{child.height = (child.height > 480) ? 480 : child.height;}); 
} 

EDIT

Lorsque vous souhaitez utiliser ce code, il suffit de créer une nouvelle classe qui étend la toile de classe, comme ceci:

package com 
{ 
    import mx.containers.Canvas 

    public class CustomCanvas extends Canvas 
    { 
     public function CustomCanvas():void 
     { 
      super(); 
     } 

     override public function addChildAt(child:DisplayObject, index:int):DisplayObject 
     { 
      super.addChildAt(child, index); 

      if(child.width > 640)child.width = 640; 
      if(child.height > 480)child.height = 480; 

      ChangeWatcher.watch(child, "width", function():void{child.width = (child.width > 640) ? 640 : child.width;}); 
      ChangeWatcher.watch(child, "height", function():void{child.height = (child.height > 480) ? 480 : child.height;}); 
     } 
    } 
} 

Pour ajouter ensuite cette en utilisant simple mxml, vous pouvez simplement faire quelque chose comme ça. Cela aura toutes les fonctionnalités d'un Canvas, étendues avec votre propre fonctionnalité adchild().

<com:CustomCanvas someproperty="somevalue"></com:CustomCanvas> 
+0

Okay génial, mais où est-ce que je mets ce code? Parce que si je le mets dans l'application, tout est évidemment surchargé. (dans une étiquette '' –

+0

J'ai édité ma réponse avec une réponse à votre question;) –

+0

Doh ofcourse c'est comme ça. Merci beaucoup pour votre contribution: D –