Flash 设置独立于父对象的子对象的动画

Flash 设置独立于父对象的子对象的动画,flash,actionscript-3,apache-flex,actionscript,Flash,Actionscript 3,Apache Flex,Actionscript,我们正在创建一个系统,其中显示单元中的元素通过xml定义。这也意味着整个系统本质上是动态的。因此,无法知道一个元素是否会有一个tween与之关联 <element id="name" type="txt" top="0" txt="Black look down" left="0" width="145" height="35"......> <transitions> <navIn> <tween typ

我们正在创建一个系统,其中显示单元中的元素通过xml定义。这也意味着整个系统本质上是动态的。因此,无法知道一个元素是否会有一个tween与之关联

    <element id="name" type="txt" top="0" txt="Black look down" left="0" width="145" height="35"......>
    <transitions>
        <navIn>
        <tween type="default" orientation="horizontal" direction="1" time=".4" delay=".2" stagger="0" ease="Quint.easeOut" />
       </navIn>
       <navOut>
        <tween type="default" orientation="vertical" direction="1" time=".4" delay="0" stagger="0" ease="Quint.easeIn" />
        </navOut>
    </transitions>
</element>

请注意,它周围还有其他元素,而且每个元素都不需要转换


我们可以看到这个元素是一个文本元素。让我们考虑(为了简单起见),这个文本元素在一个Box元素里面。此框元素可以包含其他元素,如文本(多于1个)。长方体可能始终具有与其关联的转换。现在,如果这个文本元素也有一个转换,它应该独立于框转换工作。关于如何实现这一点有什么想法吗

调整父项上的设置时,它也将应用于子项。(移动、缩放、旋转)

因此,长方体的变换将始终应用于其所有子对象。但他们肯定可以有自己的转变。(如果框具有“向上移动”过渡,文本具有“向左移动”过渡,则文本将同时向上和向左移动。)


如果您不希望文本位置受到框位置的影响,则不要将其添加为框的子项。

我可以看出您希望子项属于父项但不接收其几何变换的原因(分层、可见性、鼠标子项等)

这完全取决于您要寻找的效果,但您可以通过将父变换矩阵的逆矩阵应用于以下两者之间的容器来反转父变换(几何体-也称为缩放/旋转/平移)的效果:

在本例中,父容器(红点)被移动/旋转/缩放,而子容器(蓝点)保持静止,因为我在两者之间创建了一个容器 这可以使用Matrix.invert轻松反转父变换的效果(注意:在每个帧上执行的计算)。你可以不用容器,但是你需要注意你是如何给孩子喂奶的

您需要根据自己的需求对其进行优化,但我只是想说明这是可能的,如果不容易的话


看到了。

是的。我明白了。在这种情况下,我需要的是一个有效的解决方案!“如果您不希望文本位置受到框位置的影响,请不要将其添加为框的子项。”很抱歉投了反对票,但在编程中,我很少这么快就接受失败。=)@杰弗沃德:我不同意!我会说,不遵循最明显和最常见的规则(比如儿童不受parerent几何变换的影响)是一种糟糕的做法。如果你的想法不适合这个系统,那么解决办法不仅仅是在它起作用之前破解它。或者根据系统调整你的想法(通常是最好的,你也可能会找到更好的方法)。如果你不能遵循系统,那就自己做吧!我正在“打造我自己的”系统。如果您希望显示列表提供分层,而不是几何变换,那么我演示了如何实现。朋友,跳出框框思考。如上所述,这不是一个好方法。你的解决方案也是一个出价(孩子不是站着不动,它一直有点动)哈哈@你的否决票。再一次,很抱歉带你来。我没说这是个好主意,我说这是可能的。
package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.geom.Matrix;
  import flash.utils.setInterval;

  [SWF(width="800", height="600", frameRate="30", backgroundColor="#FFFFFF")]
  public class tst extends Sprite
  {

    public function tst():void
    {
      var prnt:Sprite = new Sprite();
      var cont:Sprite = new Sprite();
      var child:Sprite = new Sprite();

      prnt.addChild(cont);
      cont.addChild(child);

      prnt.graphics.beginFill(0xff0000);
      prnt.graphics.drawCircle(0, 0, 10);

      child.graphics.beginFill(0x0000ff);
      child.graphics.drawCircle(0, 0, 10);


      cont.addEventListener(Event.EXIT_FRAME, function(e:Event):void {
        var m:Matrix = prnt.transform.matrix.clone();
        m.invert();
        cont.transform.matrix = m;
      });

      var n:Number = 0;
      setInterval(function():void {
        prnt.x = 50+40*Math.cos(n);
        prnt.y = 50+40*Math.sin(n);
        prnt.scaleX = 3*Math.sin(n);
        prnt.rotation += 7*Math.cos(n);
        n += 0.1;
      }, 100);

      addChild(prnt);
    }
  }
}