Добавление mouseOver / mouseDown / mouseUp / etc. к пользовательскому компоненту MXML

Я новичок в Flex и портирую чистое приложение Flash / AS3 на Flex 4.5.

Я создал собственный компонент 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>

Я пытаюсь добавить эффект выделения / увеличения на mouseOver

и эффект «прижатия» к mouseDown к этому компоненту:

<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;
        }

К сожалению, эти методы вообще не вызываются.

В чистом приложении Flash / 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 Effects» (но как?), А также установить disableLayout = «true»?


person Alexander Farber    schedule 21.08.2011    source источник
comment
Я был почти уверен, что контейнеры не отправляют события мыши. Вам понадобится фактический элемент управления пользовательского интерфейса. Однако, если пользовательский интерфейс всплывает, события; вы должны иметь возможность добавлять для них слушателей в контейнер.   -  person JeffryHouser    schedule 22.08.2011
comment
вы добавляли слушателей событий в этом случае или нет? потому что вы тоже можете сделать это во флексе, так как вы все равно используете ActionScript   -  person Mansuro    schedule 22.08.2011


Ответы (1)


В 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);
                */
         }

Спасибо, Мансуро, я не смог дать вам ответа, но я поддержал ваш комментарий.

person Alexander Farber    schedule 22.08.2011