Показать сообщение отдельно
Старый 19.01.2012, 13:29
Varlamov_AS вне форума Посмотреть профиль Отправить личное сообщение для Varlamov_AS Найти все сообщения от Varlamov_AS
  № 1  
Ответить с цитированием
Varlamov_AS

Регистрация: Dec 2011
Сообщений: 31
По умолчанию Custom Button и EventListener

Доброго времени суток.

Пару месяцев изучаю AS3/Flex, поэтому не судите строго.
Ситуация такая, есть собственная кнопка. На ней стоят обработчики событий мыши. Почему-то при обычном нажатии мышкой (MOUSE_DOWN и MOUSE_UP) срабатывают также события MOUSE_OVER и MOUSE_OUT. Помогите разобраться в чем проблема.

Код класса кнопки:
Код AS3:
public class GameButton extends Sprite {
    private var _normalButtonSkin:SimpleButtonSkin;
    private var _pushedButtonSkin:SimpleButtonSkin;
    private var _focusedButtonSkin:SimpleButtonSkin;
 
    private var _mouseDown:Boolean = false;
 
    private var _text:GameButtonTextField = new GameButtonTextField();
 
    public function GameButton() {
        super();
 
        addEventListener(MouseEvent.CLICK, mouseClickHandler);
        addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
        addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
        addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
 
        createSkins();
    }
 
    public function set text(value:String):void {
        _text.text = value;
 
        this.width = _text.width + 20 + 2 * _normalButtonSkin.leftWidth;
 
        _text.x = this.width / 2 - _text.width / 2;
        _text.y = this.height / 2 - _text.height / 2;
    }
 
    override public function set width(value:Number):void {
        _normalButtonSkin.width = value;
        _pushedButtonSkin.width = value;
        _focusedButtonSkin.width = value;
 
        _text.x = this.width / 2 - _text.width / 2;
    }
 
    private function createSkins():void {
        _normalButtonSkin = new SimpleButtonSkin({
            cb: new ListEmbeddedImage.BUTTON_NORMAL_SKIN,
            lb: new ListEmbeddedImage.BUTTON_NORMAL_LEFT_SKIN,
            rb: new ListEmbeddedImage.BUTTON_NORMAL_RIGHT_SKIN});
 
        _pushedButtonSkin = new SimpleButtonSkin({
            cb:new ListEmbeddedImage.BUTTON_PUSHED_SKIN,
            lb:new ListEmbeddedImage.BUTTON_PUSHED_LEFT_SKIN,
            rb:new ListEmbeddedImage.BUTTON_PUSHED_RIGHT_SKIN});
 
        _focusedButtonSkin = new SimpleButtonSkin({
            cb:new ListEmbeddedImage.BUTTON_FOCUSED_SKIN,
            lb:new ListEmbeddedImage.BUTTON_FOCUSED_LEFT_SKIN,
            rb:new ListEmbeddedImage.BUTTON_FOCUSED_RIGHT_SKIN});
 
        addChild(_normalButtonSkin);
        addChild(_pushedButtonSkin);
        addChild(_focusedButtonSkin);
        addChild(_text);
 
        setVisibleSkin(0);
    }
 
    private function setVisibleSkin(id:uint):void {
        var i:uint;
        for (i = 0; i < 3; i++)
            if (getChildAt(i) as SimpleButtonSkin)
                getChildAt(i).visible = i == id;
    }
 
    private function mouseOverHandler(e:MouseEvent):void {
        if (!_mouseDown) {
            setVisibleSkin(2);
            trace("overHandler");
        }
    }
 
    private function mouseDownHandler(e:MouseEvent):void {
        _mouseDown = true;
        setVisibleSkin(1);
        trace("downHandler");
    }
 
    private function mouseUpHandler(e:MouseEvent):void {
        _mouseDown = false;
        setVisibleSkin(2);
        trace("upHandler");
    }
 
    private function mouseOutHandler(e:MouseEvent):void {
        setVisibleSkin(0);
        trace("outHandler");
    }
 
    private function mouseClickHandler(event:MouseEvent):void {
        setVisibleSkin(1);
        trace("clickHandler");
    }
}
при нажатии в дебаге следующее:
Код:
[trace] downHandler     //  нажал
[trace] outHandler
[trace] outHandler
[trace] upHandler         //  отпустил
[trace] outHandler
[trace] overHandler