如何在Flash / AS3中定义可见子项的矩形(“实际”元素大小)

时间:2015-06-01 13:31:24

标签: actionscript-3 flash flex canvas layout

我使用BitmapData.draw制作图形画布的快照。画布上的一些孩子处于随机位置(包括负面位置)。我应该以某种方式定义要拍摄的矩形边界。

例如,我在视图(画布)中有3个节点:

  • {10x10, (-5; -3)}
  • {20x20, (0; 0)}
  • {30x30, (40; 40)}

在这种情况下,边界应为(-5; -3)(左上)至(70; 70)(右下)。

有没有办法根据子布局定义“真实”元素大小?

可能是来自 Flex 框架的一些方法吗?

2 个答案:

答案 0 :(得分:1)

DisplayObject.getBounds()DisplayObject.getRect()是您正在寻找的方法。

两种方法

  

[返回]一个矩形,它根据targetCoordinateSpace参数定义的坐标系

定义显示对象的边界

它们之间的区别是:

  

getBounds()方法类似于getRect()方法;但是,getBounds()方法返回的Rectangle包括形状上的任何笔划,而getRect()方法返回的Rectangle则不包含。

如果您使用笔画,则可能需要使用getBounds()

答案 1 :(得分:1)

在大多数情况下看起来getBounds()getRect()应该有效,但有时候他们可能在计算右下角时遇到问题,例如,当组件显式调整大小时。

对于我的组件,我发现已经实现了方法(此解决方案也忽略了隐形孩子!):

public function calcDisplayObjecBoundingBox():Rectangle
  {
    var numChildren:int = this.numChildren;

    var result:Rectangle = new Rectangle( 0, 0, 0, 0 );
    var i:int = 0;
    var child:DisplayObject;

    if( numChildren > 0 )
    {

      //find first visible child and initialize rectangle bounds
      for( i = 0; i < numChildren; i++ )
      {
        child = this.getChildAt( i );

        if( child.visible )
        {
          result.left = child.x;
          result.top = child.y;
          result.right = child.x + child.width;
          result.bottom = child.y + child.height;
          i++;
          break;
        }
      }

      for( ; i < numChildren; i++ )
      {
        child = this.getChildAt( i );

        if( child.visible )
        {
          result.left = Math.min( result.left, child.x );
          result.right = Math.max( result.right, child.x + child.width );
          result.top = Math.min( result.top, child.y )
          result.bottom = Math.max( result.bottom, child.y + child.height );
        }
      }
    }

可能它与getBounds()getRect()几乎相同,但是按子项计算右下角,而不是组件本身。