2010-10-19 3 views
1

J'essaie de déterminer les coordonnées globales du rectangle visible qui est actuellement rendu sur la scène. Plus précisément, si un canevas a une hauteur et une largeur explicites et qu'il est un enfant d'un panneau doté d'une barre de défilement, la barre de défilement peut masquer une partie du canevas. ContentToGlobal (x, y) fournit la position globale du contenu à ce moment, mais les coordonnées de contenu peuvent faire défiler les limites du panneau parent et continuer à donner des coordonnées x, y qui ne sont pas visibles.Obtention des coordonnées globales de la zone visible d'un composant

Y at-il un moyen de déterminer le rectangle visible qui n'est caché par rien?

Répondre

4

Il se trouve que la classe UIComponent dispose d'une fonction publique non documentée qui fait exactement ce que je cherchais .

/** 
* @private 
* 
* Get the bounds of this object that are visible to the user 
* on the screen. 
* 
* @param targetParent The parent to stop at when calculating the visible 
* bounds. If null, this object's system manager will be used as 
* the parent. 
* 
* @return a <code>Rectangle</code> including the visible portion of the this 
* object. The rectangle is in global coordinates. 
*/ 
public function getVisibleRect(targetParent:DisplayObject = null):Rectangle 

C'est tiré de la classe et est documentée comme privée, mais est en fait une fonction accessible au public qui peut être utilisé sur un objet de l'interface utilisateur.

Puisque ce n'est pas dans la documentation anywehere, j'imagine qu'il peut être sensible aux changements futurs.

1

Non, il n'y a pas de solution directe.

Vous devez calculer le rectangle visible manuellement:

private function getVisibleRectangle(container:Container, child:UIComponent):Rectangle 
    { 
     var rect:Rectangle = child.getBounds(child.stage); 
     var containerMetrics:EdgeMetrics = container.viewMetrics; 
     var containerPoint:Point = container.localToGlobal(new Point(0, 0)); 
     var containerRect:Rectangle = new Rectangle(containerPoint.x + containerMetrics.left, 
      containerPoint.y + containerMetrics.top, 
      container.width - containerMetrics.left - containerMetrics.right, 
      container.height - containerMetrics.top - containerMetrics.bottom); 

     if (rect.left >= containerRect.right || 
      rect.right <= containerRect.left || 
      rect.top >= containerRect.bottom || 
      rect.bottom <= containerRect.top) 
      return null; 

     rect.left = Math.max(rect.left, containerRect.left); 
     rect.right = Math.min(rect.right, containerRect.right); 
     rect.top = Math.max(rect.top, containerRect.top); 
     rect.bottom = Math.min(rect.bottom, containerRect.bottom); 
     return rect; 
    } 

Exemple d'utilisation:

<mx:Panel id="panel" width="200" height="200"> 
    <mx:Canvas backgroundColor="green" width="100" height="100"/> 
    <mx:Canvas id="canvas" backgroundColor="red" width="500" height="400" 
     enterFrame="trace(getVisibleRectangle(panel, canvas));"/> 
</mx:Panel> 
Questions connexes