Пользовательский курсор

Казалось бы простая штука — кастомный курсор.
Есть у меня класс написанный по мотивам поста Олега Антипова в его блоге: www.anegmetex.com/devblog/2010/04/05/polzovatelskijj-graficheskijj-kursor/

Но сегодня столкнулся с интересным глюком. Оказывается событие MOUSE_LEAVE при нажатой клавише мыши срабатывает только после отпускания мышки за пределами флешки.

Вот флешка, в которой этот глюк проявляется, попробуйте нажать кнопку мыши и, удерживая ее, вывести курсор за пределы флешки:


(Здесь, на flashgameblogs.ru, при встраивании флешки используется wmode=opaque, это нетипично, и в некоторых браузерах ведет к небольшим глюкам с курсором, сделанным таким образом, поэтому вот ссылка на страничку с более типичным встраиванием.)

Что же делать? Я не придумал ничего лучшего, чем слушать событие MOUSE_DOWN и после него событие MOUSE_MOVE, в котором проверять не вышел ли курсор за пределы:

function mouseDown(e:Event):void
{
        function mouseMove(e:MouseEvent):void
        {
                if (!e.buttonDown)
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
                else
                {
                        if (e.stageX >= 0 && e.stageY >= 0 && e.stageX < stage.stageWidth && e.stageY < stage.stageHeight)
                        {
                                Mouse.hide();
                                cursorParent_.visible = true;
                        }
                        else
                        {
                                cursorParent_.visible = false;
                                Mouse.show();
                        }
                }
        }
        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);


Вот флешка, в которой глюка нет:


Раз уж я это написал, то вот сам класс: скачать. (небольшое обновление с момента поста, теперь курсор не показывается до тех пор, пока не наведешь его на флешку, раньше висел в точке (0,0), для этого просто вызывается mouseLeave при старте).

Использовать очень просто:

MouseCursor.init(stage);

MouseCursor.cursor = anyDisplayObject;

anyDisplayObject.x = -originX; // установить точку "0" курсора
anyDisplayObject.y = -originY; 

MouseCursor.defaultCursor = anotherDisplayObject;
MouseCursor.cursor = null; // курсором будет anotherDisplayObject


Класс по сути переписанный код Олега Антипова, с мелкими моими добавлениями…

Кстати, с недавних пор можно использовать родные курсоры, см. flash.ui.Mouse.cursor, но есть ограничения на курсоры.
  • +6

Комментарии (30)

0
Если кликать по второй флэшке, то мигает стандартный курсор. Так что пока не все гладко :)
0
У тебя хром, да?
+1
И в IE тоже глючит, но по другому… Это из-за wmode=opaque при встраивании. Обычно так не делают, и глюков нет. (Собственно пока не видел порталов где ставят wmode=opaque)

Я конечно не прав, т.к. флешку конечно тестил, но только в дебагплеере и сгенеренной флешдевелопом странице — там все ок во всех браузерах.

Сейчас нет времени разбираться подробно, но я это сделаю в ближайшие дни…
0
Думаю, что никто и не будет встраивать с opaque. Производительность же в этом режиме очень сильно падает.
0
Да, хром
0
У мну огненная лиса… обе флешки работают без глюков
0
ан нет… пардон — на первой курсор не видно если уводить мышь вправо или вниз потому что он просто скрывается за полем )
0
Сделал более другой курсор для наглядности :-)
0
Дружище, лучше верни как было — у мну теперь реально обе флешки работают ПРАВИЛЬНО О_о
0
У меня всё наглядно работает во всех браузерах…
0
… нажать кнопку мыши и, удерживая ее, вывести курсор за пределы флешки…
0
Блин… То ли я затупил, то ли чо… Ща все ок… )))
0
А я так и не понял разницы, ни в первой ни во второй версии.
  • FreeS
  • FreeS
0
Я тоже долго не понимал :-) год точно.
0
Я кстати уже в ожидании нового fp в котором — О ЧУДО!!! — будет работать правая кнопка мыши...:)
0
неужели к 12-й версии они таки допёрли что она необходима? ))
0
Ты серьезно или шутка такая? :)
0
Не шутка, даже среднюю кнопку можно использовать уже в 11.2, пруф — www.bytearray.org/?p=3755
0
если чо, среднюю кнопку можно было использовать еще в те времена, когда о AS3 еще слыхом не слыхивали…
кстати и правую тоже, только без надстроек не получалось до конца отключить меню (сеттинги и эбаут все равно вылазили)
0
админ, я по запарке написал два раза почти одно и то же. если не сложно, грохни это и предыдущее сообщение
0
если чо, среднюю кнопку можно было использовать еще в те времена, когда о AS3 еще слыхом не слыхивали…
кстати и правую тоже, только без надстроек не получалось до конца отключить меню (сеттинги и эбаут все равно вылазили)
кому интересно, могу рассказать поподробнее
0
потом окажется что новый плеер доступен только для air
0
не окажется
+1
Да ты шо, окажется, что доступно только на устройствах, от поддержки которых адоби отказались :)
0
Чтобы увидеть эффект, можно попробовать в первой флешке резко увести курсор за пределы — кастомный курсор зависнет.
Во второй такого повторить не удастся.

Профит.
0
Не резко, а просто зажав кнопку мышки…
0
Win7, Opera 11.60, FP11.1 — ни в первой ни во второй флешке стандартный курсор не исчезает.
  • NoICE
  • NoICE
0
А здесь?
0
а здесь исчезают оба, тока на верхней после отпускания кнопки за пределами флешки, а на нижней — непосредственно при покидании мышкой области флешки
0
Ну то есть поведение нормальное…
А на flashgameblogs зачем-то сделали при встраивании флешки wmode=opaque, и это, видимо, это не побороть: Mouse.hide плохо прячет нативный курсор.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.