确定Flex/Flash中的组件是否显示在用户屏幕上的最佳方法是什么?我正在寻找类似于Java的Component.isShowing()方法.
在show
和hide
事件触发的知名度,这似乎是一个ViewStack组件的第一后裔工作,但没有进一步下跌的显示树.
...或避免递归:
public static function isVisible(obj:DisplayObject):Boolean { while (obj && obj.visible && obj !== Application.application) { obj = obj.parent; } return obj && obj.visible; }
您想检查组件属性是否为true,这是否适用于DisplayList中组件的所有父项,我是否正确?
public static function isVisible(c : UIComponent) : Boolean { if (c == null) return false; if (c is Application) return c.visible; return c.visible && isVisible(c.parent); }
UIComponent.visible不一定对于visible = false的对象的子节点有效.来自文档:
"在任何一种情况下,对象的子节点都不会发出show或hide事件,除非该对象专门编写了一个实现来执行此操作."
我写了一个示例应用程序,证实这是真的.你可以做的是走上显示列表检查父母可见是否为假.基本上"可见"会产生误报,但不应该给出假阴性.这是我放在一起的快速实用程序:
package { import flash.display.DisplayObject; import mx.core.Application; public class VisibilityUtils { public static function isDisplayObjectVisible(obj : DisplayObject) : Boolean { if (!obj.visible) return false; return checkDisplayObjectVisible(obj); } private static function checkDisplayObjectVisible(obj : DisplayObject) : Boolean { if (!obj.parent.visible) return false; if (obj.parent != null && !(obj.parent is Application)) return checkDisplayObjectVisible(obj.parent); else return true; } } }
我没有做过比这更简单的测试,但它应该让你开始.