Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Захват мышки (http://www.flasher.ru/forum/showthread.php?t=118830)

ZlPredator 04.12.2008 20:52

Захват мышки
 
Как правильно организовать захват мышки конкретным MovieClip'ом, например при нажатии на него?

В обработчике нажатия я добавляю слушателей на все события мышки, чтобы не реагировали остальные компоненты. А по отпусканию мышки снимаю слушателей.
Код AS3:

function mouseDown(e:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_MOVE,ignore,false,int.MAX_VALUE);
    stage.addEventListener(MouseEvent.MOUSE_MOVE,ignore,true,int.MAX_VALUE);
    //и так на все события
}
 
function ignore(e:MouseEvent):void
{
    e.stopImmediatePropagation();
}

Всё работает, но есть одно большое НО. Поскольку я перехватываю сообщения MOUSE_OVER, ROLL_OVER, то они не доходят до клипов. И когда пользователь отпускает мышку, я снимаю свои блокировки, но клипы уже не получат ни MOUSE_OVER ни ROLL_OVER, а вот MOUSE_MOVE, MOUSE_OUT, ROLL_OUT получат.
Иногда такое поведение сбоит логику компонентов. Можно обойти этот косяк или вообще по другому организовать захват мышки?

wvxvw 04.12.2008 22:11

Просто отказаться от идеи и использовать mouseChildren когда это необходимо. Еще вариант - положить на стейдж клип, который бы весь стейдж закрывал и слушать события у него, а всем остальным диспатчить в зависимости от положения мышки (примерно так это сделано во флексовом фреймворке), но, по-моему, второй вариант плохой т.как 1. события мышки будут все время ловиться (лишняя нагрузка), 2. +1 (как минимум) лишний вызов метода. 3. возникнут сложности при загрузке такой флешки в другую / изменении свойства scale у стейджа и т.д.

ZlPredator 05.12.2008 13:20

От идеи отказываться не хотелось бы - это дополнительное удобство пользователям.
mouseChildren работает отлично! Спасибо. Кому интересно:
Код AS3:

function mouseDown(e:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp);
    stage.mouseChildren = false;
}
 
function mouseUp(e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUp);
    stage.mouseChildren = true;
}



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

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