[Laszlo-dev] About moving nodes...
Raju Bitter
rajubitter at me.com
Sat Oct 17 16:52:35 PDT 2009
There's a typo in the code: It's AS2 instead of AS3 in this line, of
course...
Debug.warn("Moving display objects from one movieclip to another
not supported in AS2");
On Oct 17, 2009, at 9:10 PM, Raju Bitter wrote:
> I remember that this is a limitation of an the SWF runtime until AS2/
> SWF8. Starting with AS3/SWF9 the behavior of managing visible
> objects was modified:
>
> http://my.safaribooksonline.com/0596526954/ID-d2450e71-Introduction529380
>> Anytime a MovieClip was created (in AS2), it was automatically
>> added into the visual hierarchy and consequently drawn by the
>> renderer. MovieClips weren't able to move to different places
>> within the hierarchy; instead, they first had to be destroyed and
>> then recreated before they could be positioned elsewhere in the
>> display.
>>
>> The new renderer (AS3/SWF9) is still hierarchical, but not as
>> rigid, and aims to simplify and optimize the rendering process. The
>> new rendering model centers on the display list concept and focuses
>> on the classes available in the flash.display package. The display
>> list is a hierarchy that contains all visible objects in the .swf
>> movie. Any object not on the display list is not drawn by the
>> renderer.
>
> That means, you can remove the object from a display list and add it
> to a new display list. Here's a code example:
> <canvas width="100%" height="800">
>
> <view id="containerA" y="100" width="200" height="200"
> bgcolor="blue">
> <view id="targetObj" width="150" height="150" bgcolor="yellow">
> <method name="whereAmI">
> Debug.write("Parent for targetObj view: " + this.parent);
> var s = this.getDisplayObject();
> Debug.write(s);
> Debug.write("Owner for targetObj view: ", s.parent.owner);
> </method>
> <button text="Click me!" onclick="parent.whereAmI()" />
> </view>
> </view>
>
> <view id="containerB" x="400" y="100" width="200" height="200"
> bgcolor="green">
>
> </view>
>
> <button text="move yellow view" onclick="moveView()">
> <method name="moveView">
> if ($as3) {
> #passthrough {
> Debug.write(containerA.getDisplayObject());
> var spriteA = containerA.getDisplayObject();
> spriteA.removeChild(targetObj.getDisplayObject());
> var spriteB = containerB.getDisplayObject();
> spriteB.addChild(targetObj.getDisplayObject());
> }#
> } else if ($as2) {
> Debug.warn("Moving display objects from one movieclip to
> another not supported in AS3");
> }
> </method>
> </button>
>
> </canvas>
>
> Run this in SWF: you can move the yellow view from the blue to the
> green box. #containerA is still listed as parent, even if the yellow
> view has been attached to #containerB, but the owner reference
> changes.
>
> @Henry: Do you have any idea what impact such an action of would
> have on the OL view system?
>
> - Raju
>
> On Oct 17, 2009, at 7:18 PM, P T Withington wrote:
>
>> There is a `placement` attribute, and a `determinePlacement` method
>> that can be overridden by a class, but both of these expect the
>> final placement of a node to be determined at construct time. I
>> don't know if this restriction is inherent to LzNode, or was a
>> restriction due to some ancient runtime (e.g., swf5). It might be
>> possible to make placement dynamic. Clearly any parent/child
>> dependencies would have to be tracked and adjusted as part of this.
>>
>> <state> is sort of a half-step to this, in that it can dynamically
>> remove and add child views, but state does _not_ guarantee the
>> child view's state information is preserved. In effect a state
>> destroys and re-creates the child views it controls each time.
>>
>> You can modulate the `visible` attribute of a view to hide/reveal
>> it and all its children. Modulating the visibility _does_ preserve
>> the hidden views state.
>>
>> I'd be interested in seeing an example of an application where
>> views need to move.
>>
>> On 2009-10-16, at 20:39, Rami Ojares / AMG Oy wrote:
>>
>>> Hi,
>>>
>>> Would it even be theoretically possible to make parent attribute
>>> of node read/write.
>>> Now moving nodes around means destroying old ones and creating new
>>> ones under new parent.
>>> This becomes a nightmare when the nodes have all kinds of
>>> connections to other nodes.
>>>
>>> I know this is a BIG issue but I wondered if this would be even
>>> theoretically possible and what it would require.
>>>
>>> Now that I do it manually I will have to maintain two way links
>>> between dependencies.
>>>
>>> Example:
>>> - A depends on B (a is listening to events from B)
>>>
>>> If I move B I have to know who is listening so I can update the
>>> delegates to listen to events from the new B node
>>> If I could move B without destroying it and creating a new one,
>>> the delegates would not need updating.
>>>
>>> - rami
>>>
>>
>
More information about the Laszlo-dev
mailing list