其实这是个历史问题,Flex 3 以前,所有Flex容器组件都是Container组件的子类,而Container组件重写了UIComponent.contentMouseX、UIComponent.contentMouseY的代码。
以UIComponent.contentMouseX为例
//UIComponent.as //……………… //在UIComponent中 contentMouseX返回的是UIComponent.mouseX的值 public function get contentMouseX():Number { return mouseX; } //而UIComponent.mouseX 是先判断该组件的root是否存在,并拥有一个名为 //“http://www.adobe.com/2006/flex/mx/internal::_mouseX”的属性 //(名为fakeMouseX的QName对象.toString()) //如果存在且拥有,则会获取root. 的值, //返回 使用该值作为参数用globalToLocal方法计算出的结果 //若root不存在或没有该属性,则返回Flash原生Sprite对象的mouseX override public function get mouseX():Number { if (!root || root is Stage || root[fakeMouseX] === undefined) return super.mouseX; return globalToLocal(new Point(root[fakeMouseX], 0)).x; } //而在Container中,重写了contentMouseX的代码 //Container.as //如果Container的内容子面板contentPanel(一个FlexSprite对象,在Container的 mx_internal //function createContentPane()方法中创建)存在,则返回该面板的mouseX属性 //否则直接返回UIComponent.contentMouseX override public function get contentMouseX():Number { if (contentPane) return contentPane.mouseX; return super.contentMouseX; } //所以对于Container子类组件而言,如果因内容很多显示了滚动条,则该Container.contentMouseX //返回的是以整个内容区域左上角(包含了未显示的滚动区域)计算的鼠标位置, //而Container.mouseX则返回的是以 可见滚动区域左上角计算的鼠标位置
而这个区别在GroupBase子类组件,SkinnableContainer子组件中并不存在,因为spark容器组件都没有重写contentMouseX,返回的是UIComponent.contentMouseX坐标,即Sprite的mouseX值,如果通过Scroller或是其他方式显示了滚动条,contentMouseX和mouseX都是 以整个内容区域左上角(包含了未显示的滚动区域)计算的鼠标位置
时间: 2024-10-23 08:37:20