Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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

Старый 19.01.2012, 13:48
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Реакция на скины? MouseChildren=false
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Nov 2010
Сообщений: 150
Код AS3:
 getChildAt(i).visible = i == id;
Символ скрывается, соответственно ему приходит out, показывается - приходит over. Для нормальной работы можно _normalButtonSkin, _pushedButtonSkin, _focusedButtonSkin установить значения mouseEnabled = false и добавить еще один прозрачный слой по размеру кнопки, который не скрывается, чтобы отлавливать события только у одного элемента.

Старый 19.01.2012, 14:03
ProxyGreen вне форума Посмотреть профиль Отправить личное сообщение для ProxyGreen Найти все сообщения от ProxyGreen
  № 4  
Ответить с цитированием
ProxyGreen
 
Аватар для ProxyGreen

Регистрация: Jul 2011
Сообщений: 67
А это когда с visible балуешься получается такое.
ведь когда вы вызываете:
setVisibleSkin(1);
При нажатии, единственный видимый спрайт пропадает и генерируется событие MOUSE_OUT.
Я обычно поверх всего помещаю прозрачный прямоугольник, который всегда остаётся на своем месте и уже его подписываю на события. Да и лучше в вектор забить эти скины, как-то не кошерно гетЧилд вызывать.

\\ упс опоздал )

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

Регистрация: Dec 2011
Сообщений: 31
Спасибо. А каким образом создается эта маска?

Старый 19.01.2012, 14:40
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 6  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Просто полностью прозрачный символ (alpha = 0) по форме кнопки, можно использовать к примеру тот же символ что и для _normalButtonSkin.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
custom component , EventListener , Sprite
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:56.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.