
在Flash自带的ComboBox组件中,下拉列表部分是被加到主场景(Stage)上的。这就带来一些问题:比如ComboBox放在一个运动着的可视对象上,点开下拉列表后,这部分并不会跟随着父物体运动。如果父物体是三维层,下拉列表也不会继承上层的属性,这就会造成视觉上的问题。
下面的代码演示了一个不修改ComboBox源代码的前提下解决这个问题的小技巧。思路很简单:监听下拉列表的打开和关闭事件,动态改变dropdown对象的parent。
// cb is a ComboBox instance
cb.addEventListener(Event.OPEN, openHandler, false, 0, true);
cb.addEventListener(Event.CLOSE, closeHandler, false, 0, true);
private function openHandler(event : Event) : void
{
// wait one frame
addEventListener(Event.ENTER_FRAME, tick, false, 0, true);
}
private function closeHandler(event : Event) : void
{
// hide dropdown
cb.dropdown.visible = false;
// add dropdown back to stage
stage.addChild(cb.dropdown);
}
private function tick(event : Event) : void
{
removeEventListener(Event.ENTER_FRAME, tick);
// add dropdown to another parent
someContainer.addChild(cb.dropdown);
// reposition dropdown if needed
cb.dropdown.move(cb.x, cb.y + cb.height);
// show dropdown
cb.dropdown.visible = true;
}https://gist.github.com/721420