其实这是个历史问题,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都是 以整个内容区域左上角(包含了未显示的滚动区域)计算的鼠标位置
本文出自 “博客命名跟变量名一样麻烦” 博客,请务必保留此出处http://cstar.blog.51cto.com/2923639/1589414
Flex 4中 mouseX 与 contentMouseX的区别
原文:http://cstar.blog.51cto.com/2923639/1589414