Захват колеса мыши
После перехода на ActionScript 3 и Flash Player 9 вы наверняка сталкивались с тем, что размещенный на странице ролик не захватывает скролл мыши (как это было в ActionScript 1/2), позволяя пользователю прокручивать содержимое страницы независимо от того, находится ли ролик в фокусе или нет. Достаточно давно я опубликовал класс GlobalMouse, он решал данную проблему, но в целом был неудобен именно для решения подобной проблемы. В связи с этим, я написал класс MouseWheel, позволяющий захватывать и отпускать скролл мыши в любой момент времени при необходимости. К сожалению, браузер Safari, а также Mac OS-версии популярных браузеров (Opera/Firefox) не позволяют захватывать скролл мыши, поэтому данный класс в них работать не будет.
Посмотреть демо вы можете здесь. Исходный код примера и сам класс найдете на той же странице.
38 comments
38 Comments so far
Leave a reply
А проблема скролла на маке решена весьма элегантным костылем для swfobject
http://blog.pixelbreaker.com/flash/swfmacmousewheel/
Да, я знаю про это, но MouseWheel не для этого
Он не решает проблемы со скроллингом внутри приложения, он решает проблему монопольного захвата флешем колеса мыши. Под виндой очень актуально.
А чем таким прикольным Вы генерите страницу с исходным кодом?
Flex Builder 3, собственно
Хех, нужно попробовать
Ради интереса: Вы писали это в FDT?
Нет, всё в том же Flex Builder.
В опере почему-то со второго раза только захватывает.
Странно, у меня вроде с первого. Как вариант, первый клик в Опере может быть необработан, т. к. в ней тоже требуется активация swf-ролика, как в IE.
FontLoader ne rabotaet v Adobe AIR.
Nado dobavit etoto code chtpbi on rabotal:
var ldrC : LoaderContext = new LoaderContext();
ldrC.allowLoadBytesCodeExecution = true;
this._libLoader.loadBytes(fontSWF,ldrC);
У меня тоже не с первого клика срабатывает (в примере скрипта и у себя).
Работать начинает только после такого:
MouseWheel.capture();
stage.addEventListener(MouseEvent.MOUSE_DOWN, this._captureMouse);
private function _captureMouse(e:Event):void{
MouseWheel.release();
MouseWheel.capture();
}
Браузер FF3
Это странно, должно, по идее, работать с первого раза.
[...] MouseWheel, теперь захват мыши работает сразу и без вопросов. [...]
[...] UPDATE: Причесанный класс только для захвата мыши. [...]
Я таким образом реализовывал шорткаты с контролом (ctrl+c и т.п.) – загрузкой avm1 swf и общением через LC.
Как раз тогда спрашивал как зашить в бинарник swf переменную, для задания id LC в avm1 свэфке )
Ну вот, наглядный пример теперь есть
Интересный код, работает. Вы могли бы объяснить (даже в отдельном посте) – как устроен ваш класс MouseWheel ?
Да всё очень просто, в AS1/AS2 подписка на мышь (на то же событие onMouseWheel) приводила к тому, что фокус наглухо захватывался флешкой. В AS3 же захватить скролл мыши невозможно.
MouseWheel содержит в себе бинарник AVM1-swf-ки, загружает его лоадером, предварительно вписав случайное имя LocalConnection-соединения, которое нужно для того, чтобы можно было отписываться и подписываться на события мыши в AVM1. Т. е. получается валидный swf с нужным именем соединения и кодом, который выполняет простейшие операции по подписке и отписки от событий мыши.
А под макосью не получиться заставить работать?
Чисто теоретически, но тогда нужно будет интегрировать какой-нибудь JavaScript в это дело.
Здравствуйте, подскажите, пожалуйста, при подключении класса появляется ошибка
TypeError: Error #1006: loadBytes не является функцией.
с чем это может быть связано?
Версия плеера должна быть 9.0.45.0 и выше.
Спасибо огромное за класс!!!
Спасибо за класс! Но после захвата мыши не работает прокрутка вниз в mx:List. При том вверх работает.
Честно говоря, не знаю, каким образом MouseWheel может повлиять на mx:List
Все-таки не могу подключить класс нормально, может неправильно что-то делаю.
Просто написал MouseWheel.capture();
и выскакивает ошибка
TypeError: Error #1006: loadBytes не является функцией.
at ru.etcs.ui::MouseWheel$/capture()
at classes::Main()
Пользуюсь flash плеер 10, as3.
Метода loadBytes не существовало в версиях ниже 9.0.45.0. В десятой он стопроцентно есть. Других вариантов, кроме версии плеера, при которых может возникнуть подобная ошибка, нет.
Разобрался с проблемой. В моем проекте нашелся класс Loader, убрал его, теперь все отлично работает.
Спасибо большое за такой полезный класс!
Использую ваш класс, спасибо огромное.
Но остается один не очень приятный момент, колесо мыши начинает обрабатываться только после клика на поле ролика.
После клика колесо “захватывается” и html страница не прокручивается. А чтобы опять ее начать прокручивать надо кликнуть за пределами ролика.
Чтобы захватить колесо, надо опять кликнуть на поле и так по кругу.
Данный эффект наблюдается в Opera 10
В IE 6 необходим только самый первый клик на поле ролика, потом циклы захвата и отпускания проходят без проблем.
В FF 3.0.18 – работает все без кликов.
Да, забыл сказать, что захватывание мыши на поставил так
stage.addEventListener(MouseEvent.MOUSE_OVER, mouseWheelCatcherListener);
stage.addEventListener(MouseEvent.MOUSE_OUT, mouseWheelCatcherListener);
ЭЭ, а зачем вы подписались на стандартные события родного Stage? Причем тут MouseWheel?
когда пользователь наводит курсор мыши на ролик, я захватываю колесо,
когда уводит мышь за пределы – отпускаю
чтобы он мог прокручивать html файл
Аа, вот так даже. Боюсь, что на захват фокуса флешем я повлиять никак не могу, ранее можно было сделать принудительный фокус, но в последствии эту возможность в браузерах закрыли.
фокус? может я что-то не понимаю?
я захватываю колесо мыши используя ваш класс
вот код функции-слушателя
private function mouseWheelCatcherListener(event:Event):void {
if (MouseWheel.captured) {
MouseWheel.release();
} else {
MouseWheel.capture();
}
}
Если проследить логику вашего обработчика, то получается, что независимо от происходящего события, мышь захватывается и отпускается постоянно. MOUSE_OVER к тому же всплывающий. По хорошему надо использовать MOUSE_OVER и MOUSE_LEAVE.
Опыта у меня мало, всего около месяца “щупаю” flash…
Про MOUSE_LEAVE даже не слышал, попробую.
В mouseWheelCatcherListener я убрал все trace, а по ним было видно, что захватывается только когда наводишь и отпускается только когда уводишь мышку.
Ссылку указать не получается – комментарий при этом не добавляется
Может так сработает – autoclubnn.ru/map.html
Благодарю, приятный и полезный скрипт.
[...] статью об этом можно тут, а так же почитать с его слов, как это [...]