获取组件可见区域的全局坐标

时间:2010-10-19 17:12:01

标签: flex flex3

我正在尝试确定当前在舞台上呈现的可见矩形的全局坐标。

具体来说,如果画布具有明确的高度和宽度并且是具有滚动条的面板的子画面,则滚动条可以“隐藏”画布的一部分。 ContentToGlobal(x,y)提供当时内容的全局位置,但内容坐标可以滚动父面板的边界并继续提供不可见的x,y坐标。

有没有办法确定没有被任何东西隐藏的可视矩形?

2 个答案:

答案 0 :(得分:4)

事实证明,UIComponent类有一个未记录的公共函数,它完全符合我的要求。

/**
 *  @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

这是从类中提取的,并记录为私有,但实际上是可以在任何UI对象上使用的可公开访问的函数。

由于这不在任何文档中,我想它可能会受到未来变化的影响。

答案 1 :(得分:1)

不,没有直接的解决方案。

您应手动计算可见矩形:

    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;
    }

使用示例:

<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>