PDA

Просмотр полной версии : как отключить мышь у всего стейджа?


undefined
13.11.2015, 02:16
Сабж.Несмотря на то, что стейдж - контейнер, код
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
Ни один объект, находящийся под ним, их не получит
Не думал, что буду говорить это тебе
баблинг (http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html)

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
что-то я совсем запутался
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-текстфилды не выделяются:
(this.root as Sprite).mouseEnabled = false;
(this.root as Sprite).mouseChildren = false;

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