2011-08-21 72 views
2

我是新来的Flex和我移植一个纯粹的Flash/AS3应用的Flex 4.5添加mouseOver/mouseDown/mouseUp /等。自定义MXML组件

我已经创建了一个基于BorderContainer

<?xml version="1.0" encoding="utf-8"?> 
<s:BorderContainer 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    width="160" height="140" > 

    <s:Image id="_avatar" enableLoadingState="true" 
     x="0" y="0" width="160" height="120" /> 

    <s:Label id="_username" x="0" y="125" 
     fontSize="12" fontWeight="bold" /> 

</s:BorderContainer> 

我想自定义MXML组件添加高亮/长功效鼠标悬停

和鼠标按下“按下”效应,该组件:

<fx:Script> 
    <![CDATA[ 
     import flash.filters.*; 

     public static const SHADOW:Array = [ new DropShadowFilter(8, 
      80, 0x000000, 0.2, 32, 32, 1, 1, false, false, false) ]; 
     public static const GLOW:Array = [ new GlowFilter(0xFFFF00, 
      0.5, 36, 36, 1, 1, false, false) ]; 

     private var _oldScale:Number; 

     private function mouseOver(event:MouseEvent):void { 
      _oldScale = scaleX; 
      filters = GLOW; 
     } 

     private function mouseDown(event:MouseEvent):void { 
      _oldScale = scaleX; 
      scaleX *= 0.95; 
      scaleY *= 0.95; 
      filters = null; 
     } 

     private function mouseUp(event:MouseEvent):void { 
      scaleX = scaleY = _oldScale; 
    filters = GLOW; 
     } 

     private function mouseOut(event:MouseEvent):void { 
      scaleX = scaleY = _oldScale; 
      filters = SHADOW; 
     } 

不幸的是,这些方法根本没有被调用。

在纯闪存/ AS3应用程序,我会打电话给

 addEventListener(MouseEvent.MOUSE_OVER, handleMouseOver); 
     addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown); 
     addEventListener(MouseEvent.MOUSE_UP, handleMouseUp); 
     addEventListener(MouseEvent.MOUSE_OUT, handleMouseOut); 
     addEventListener(MouseEvent.CLICK, handleMouseClick); 

,它会工作得很好,但在这里,在Flex 4.5中,我不知道如何做到这一点。

此外,我注意到有一个dropShadowVisible =“true”属性,但不知道如果/如何可以用于我的目的。

我不确定是否允许在Flex中缩放自定义组件,或者我可能应该使用“Flex效果”(但是该怎么做?)并设置为disableLayout =“true”

+0

我很确定容器不派遣鼠标事件。你需要一个真正的UI控件。但是,如果UI控件冒泡事件,你应该能够在容器上为它们添加监听器。 – JeffryHouser

+1

你在这种情况下添加了事件监听器吗?因为你也可以在flex中做到这一点,因为无论如何你都在使用actionscript – Mansuro

回答

4

无论是2种方法下面为我工作的Flex 4.5:

<?xml version="1.0" encoding="utf-8"?> 
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" 
width="160" height="140" 
mouseOut="handleMouseOut(event)" 
mouseDown="handleMouseDown(event)" 
mouseUp="handleMouseUp(event)" 
mouseOver="handleMouseOver(event)" 
creationComplete="init(event)"> 

<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 

     public function init(event:FlexEvent):void { 
       /* 
       addEventListener(MouseEvent.MOUSE_OVER, handleMouseOver); 
       addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown); 
       addEventListener(MouseEvent.MOUSE_UP, handleMouseUp); 
       addEventListener(MouseEvent.MOUSE_OUT, handleMouseOut); 
       addEventListener(MouseEvent.CLICK, handleMouseClick); 
       */ 
     } 

谢谢Mansuro,我不能给你答案,但我已经upvoted yoyur评论。