Форум 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=211815)

undefined 13.11.2015 02:16

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

if (stage)
        stage.mouseEnabled = stage.mouseChildren = false;

Выплевывает
Цитата:

The Stage class does not implement this property or method.
Как быть?

caseyryan 13.11.2015 08:38

Кэп мне тут подсказывает: добавь сверху прозрачный спрайт во всю сцену)

undefined 13.11.2015 12:22

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

Добавлено через 3 минуты
Самое интересное,что свойство существует,но его зачем-то переопределили

callme 13.11.2015 12:36

Снимай листенер со стейджа, когда нужно отключить автозакрывалку.

undefined 13.11.2015 12:40

Вот не хотелось бы.Попап о своем контенте ничего не знает.Но если стейдж не отключить никак, придется ввести эту зависимость.

callme 13.11.2015 12:44

А тот, кто делает stage.mouseChildren = false, он же знает про контент. Можно там листенер снимать со стейджа.

faraday 13.11.2015 15:03

у попапов почти всегда есть оверлей по размеру экрана. прозрачный или нет - это уже вам решать, но снимать слушатели со всех кнопок слоя ниже - явно занятие безинтересное) Соответственно слушать клик на оверлей, а там уже от типа окна вызывать closeMe или нет

undefined 13.11.2015 17:12

это верно если попап модальный, что бывает не всегда
Решил проблему геттером isBusy у контента, который попап проверяет и решает закрываться или нет.

caseyryan 13.11.2015 17:51

Как по мне, так этот способ - более костыльный, чем добавление прозрачного спрайта.

Лучше сделай у своих попапов свойство container которому присваивай значение не сцены, а документ класса. По сути, какая тебе разница, будет он добавляться на stage или в документ-объект. Зато у документ объекта ты можешь запросто сделать mouseEnabled = false

undefined 13.11.2015 19:05

Цитата:

чем добавление прозрачного спрайта
еще раз, спрайт не подходит.
Каким образом он предотвратит получение мышинных событий контейнером?

caseyryan 14.11.2015 18:59

Цитата:

Каким образом он предотвратит получение мышинных событий контейнером?
Ты вообще пробовал это? Так все делают) Он перекрывает все мышинные события. Ни один объект, находящийся под ним, их не получит

udaaff 14.11.2015 20:38

Видимо, имелось в виду не контейнером, а стейджем. Можно попробовать ловить события заглушкой и делать stopPropagation(); Ну или смотреть от кого пришел клик, если от заглушки, то ничего не делаем.

undefined 14.11.2015 22:21

Цитата:

Ни один объект, находящийся под ним, их не получит
Не думал, что буду говорить это тебе
баблинг

caseyryan 14.11.2015 23:14

При чем тут бабблинг?) Ты ставишь спрайт, у которого прозрачная заливка во весь размер сцены, поверх всего. Он принимает все щелчки. Или ты думаешь, что я так не делал и просто так это ляпнул? Это отлично работает и в простом флеше и в старлинге. Большая часть попапов именно так и сделана

Но если тебе не нравится идея со спрайтом, то есть еще два варианта. Первый из них я уже написал
Цитата:

Лучше сделай у своих попапов свойство container которому присваивай значение не сцены, а документ класса. По сути, какая тебе разница, будет он добавляться на stage или в документ-объект. Зато у документ объекта ты можешь запросто сделать mouseEnabled = false
А второй - при добавлении попапа, добавляй к сцене слушатель щелчка с приоритетом int.MAX_VALUE, и в его обработчике проверяй что именно было щелкнуто. Если не твой попап, то делай event.stopImmediatePropagation();
Так я тоже делал, и этот вариант тоже 100% рабочий

Wolsh 14.11.2015 23:30

Кейси, у человека Стейдж подписан на события. Он спрашивает тебя, каким образом добавление в этот Стейдж еще одного объекта заставит Стейдж не принимать события мыши.

undefined 14.11.2015 23:58

Цитата:

Кейси, у человека Стейдж подписан на события. Он спрашивает тебя, каким образом добавление в этот Стейдж еще одного объекта заставит Стейдж не принимать события мыши.
ну хоть кто-то понял.

Добавлено через 20 минут
Цитата:

Лучше сделай у своих попапов свойство container которому присваивай значение не сцены, а документ класса.
не до конца понял документ-класс == root? Но у него нет свойства mouseEnabled

Wolsh 15.11.2015 00:24

Цитата:

Но у него нет свойства mouseEnabled
Ну потому что он DisplayObject а не контейнер (как бы странно это ни звучало). Надо приводить к интерактиву или спрайту.

undefined 15.11.2015 00:26

Цитата:

А второй - при добавлении попапа, добавляй к сцене слушатель щелчка с приоритетом int.MAX_VALUE
Да, собственно сейчас так и есть, только в обработчике вместо event.stopImmediatePropagation()
происходит закрытие попапа, поэтому останавливать событие нет необходимости.

Добавлено через 12 минут
Цитата:

Ну потому что он DisplayObject а не контейнер
Действительно странно.

Wolsh 15.11.2015 03:35

Цитата:

Действительно странно.
Наверное, потому что некоторые контейнеры скрывают что они контейнеры (TextField, Shape). Но как они могут стать root я не представляю((

undefined 16.11.2015 15:05

что-то я совсем запутался
Код AS3:

public function init(e:Event = null):void {
...
(root as DisplayObjectContainer).mouseEnabled=(root as DisplayObjectContainer).mouseChildren = false;
...

по идеи должен выключить мыша на всем стейдже, но не тут то было, все кнопки работают.
Цитата:

Наверное, потому что некоторые контейнеры скрывают что они контейнеры
Интересно это средствами языка делается или на нативном уровне?

caseyryan 16.11.2015 18:30

Цитата:

по идеи должен выключить мыша на всем стейдже, но не тут то было, все кнопки работают.
По какой такой идее? root != stage

Wolsh 16.11.2015 18:35

Цитата:

по идеи должен выключить мыша на всем стейдже, но не тут то было, все кнопки работают.
а при чем здесь стейдж? Рут это документ-класс. Если у Вас кнопки выброшены с корабля в открытый космос стейдж, их отношение к мышам капитана не касается.
(У меня рут гасится, если что, вот так — и даже input-текстфилды не выделяются:
Код AS3:

                        (this.root as Sprite).mouseEnabled = false;
                        (this.root as Sprite).mouseChildren = false;

Цитата:

Интересно это средствами языка делается или на нативном уровне?
Какого еще языка?)) Вы же не думаете, что TextField и Shape написаны на AS3? Не путайте интерфейс с реализацией.


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

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