
在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