Flex 3 - проблемы с извлечением событий мыши при использовании масок и фильтров - PullRequest
2 голосов
/ 06 апреля 2011

Вот компонент, над которым я работаю:

enter image description here

А вот класс компонента:

public class PromoPanel extends Canvas
{
    private var corner:PromoCorner;
    private var text:Text;
    private var roundedMask:Sprite;
    private var cornerUpdated:Boolean = false;
    private var textUpdated:Boolean = false;

    private var container:Canvas;

    public function PromoPanel()
    {
        super();


        // Defining corner's properties
        corner.addEventListener(MouseEvent.Roll_Over, objectHandler);
        corner.addEventListener(MouseEvent.Roll_Out, objectHandler); 

        // Defining text's properties

        roundedMask = new Sprite;
        roundedMask.mouseChildren = false;
        roundedMask.mouseEnabled = false

        container = new Canvas; 
        container.percentWidth = 100; 
        container.minHeight = 100;
        container.maxHeight = 345;
        container.setStyle('backgroundColor', 0xffffff);
        container.addChild(corner);
        container.addChild(text);  
        container.horizontalScrollPolicy = 'off'; 
        this.addChild(container);
    }

    public function update():void{
        var s:String = 'blabla'; 

        text.addEventListener(FlexEvent.UPDATE_COMPLETE, updateHandler);
        text.text = s;

        corner.addEventListener(MyEvent.CORNER_UPDATED, updateHandler);
        corner.build();
    }

    private function updateHandler(e:Event):void{
        switch(e.type){
            case MyEvent.CORNER_UPDATED:
                cornerUpdated = true;
                corner.removeEventListener(MyEvent.CORNER_UPDATED, updateHandler);
                break;
            case FlexEvent.UPDATE_COMPLETE:
                textUpdated = true;
                text.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateHandler);
                break;
        }

        if(cornerUpdated && textUpdated){
                roundedMask.graphics.clear();
                roundedMask.graphics.beginFill(0xFFFFFF);
                roundedMask.graphics.drawRoundRect(0, 0, container.width, container.height, 20, 20);
                roundedMask.graphics.endFill();  
                this.mask = roundedMask;  

                dispatchEvent(new MyEvent(MyEvent.PROMO_UPDATED));
            } 
        var glow:DropShadowFilter = new DropShadowFilter(0,0,0x2E2E2E,0.6,10,10,0.5,1);
        this.filters = [glow]; 
    }

    private function objectHandler(e:Event):void{
        switch(e.type){
            case MouseEvent.ROLL_OUT:
                trace('out' + mouseX + '/' + mouseY);
                break;
            case MouseEvent.ROLL_OVER:
                trace('on' + mouseX + '/' + mouseY);
                break;
        }
    }       
...
}

Для более детального понимания: угол - эточерный угол с (i) и «Поощрением», текст - это некоторый случайный текст, который может отображаться в оставшемся пустом пространстве, контейнер содержит угол и текст, и, наконец, этот класс содержит контейнер!

Что мне нужно сделать?
Мне нужно извлечь событие mouseevent.rollover / rollout из угла.

А что не так?
1. Когда я помещаю маску на контейнер (container.rawchildren.addchildren + container.mask = mask) и drophadowfilter на контейнер (container.filters = [glow]),Я не могу обнаружить события мыши.
2. Когда я помещаю маску на промопанель (this.rawchildren.addchildren + this.mask = mask) и фильтр drophadowfilter на промопанель (this.filters = [glow]), я не могуобнаружение событий мыши.
3. Когда я помещаю маску в компонент, а фильтр - в другой, он тоже не работает.
4. Если я удаляю маску ИЛИ фильтр, она работает !!Но мне нужны они оба ...

Итак, у кого-нибудь есть идея, как заставить это работать?Я пытался найти проблемы с фильтрами, масками и событиями мыши, но не нашел ничего, что могло бы пролить свет на эту проблему ...

Что-нибудь было бы полезно и не стесняйтесь задавать вопросы, если что-то недостаточно ясно,

Спасибо!
С уважением,
BS_C3

1 Ответ

1 голос
/ 07 апреля 2011

Ну, я чувствую себя немного неловко, отвечая на мой собственный вопрос:)
Комбинация, в которой я был уверен (конечно, нет), работает: если я надену маску на контейнер и фильтр на промопанель, она сработает ....

Подумав, это имеет смысл.
Я заметил, что включение маски и фильтра в один и тот же компонент каким-то образом делает его глухим к событиям мыши. Но при использовании только одного или другого все работало нормально.
Однако положить маску на промопанель и фильтр в контейнер не получилось. Кроме того, таким образом маска будет скрывать фильтр (который мне нужен!).
Надеть маску на контейнер без фильтра у меня получилось, и слушатели могли получить события мыши. Тогда добавление фильтра на промопанель не сохранило контейнер для прослушивания событий угла ...

Надеюсь, это кому-нибудь поможет:)
Привет.
BS_C3

...