其实这是个历史问题,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._mouseX 的值,
//并返回 使用该值作为参数用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则返回的是以 可见滚动区域左上角计算的鼠标位置

如下图,在Canvas组件中加入一张大图,拖动滚动条后,把鼠标移到图片左上角

Flex 4中 mouseX 与 contentMouseX的区别_Flex 4


而这个区别在GroupBase子类组件,SkinnableContainer子组件中并不存在,因为spark容器组件都没有重写contentMouseX,返回的是UIComponent.contentMouseX坐标,即Sprite的mouseX值,如果通过Scroller或是其他方法显示了滚动条,contentMouseX和mouseX都是 以整个内容区域左上角(包含了未显示的滚动区域)计算的鼠标位置

如图,不论滚动条的位置在哪里Group的mouseX和contentMouseX,mouseY和contentMouseY都是相同值

Flex 4中 mouseX 与 contentMouseX的区别_Flex 4_02