![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2010
Сообщений: 98
|
Есть клип, который регариует на события мыши (наведение/отведение), но реагирует неадекватно, т.к. есть родительский клип. Как сделать так, чтоб он не мешал?
|
|
|||||
|
Может быть поставить свойство mouseEnabled родительского клипа в false? Вообще же, что значит "неадекватно"? Приведенный вами пример кода, возможно, пролил бы свет на вашу проблему.
|
|
|||||
|
Регистрация: Sep 2010
Сообщений: 98
|
mouseEnabled=false делает так, что не реагируют потомки, а нужно,наоборот, чтоб не реагировал родитель. Неадекватно ведёт - мограет вместо того, чтоб исчезать
|
|
|||||
|
Смоделировал ситуацию. Понял, что моргает он вполне адекватно, потому что происходит следующее:
1) Наводим мышку, возникает событие MOUSE_OVER. 2) Вызывается функция mouse_over, которая скрывает объект. 3) Скрытие объекта вызывает событие MOUSE_OUT. 4) Которое, в свою очередь вызывает функцию mouse_out, показывающую объект. 5) Объект показывается, вызывается MOUSE_OVER, и так далее. Добавлено через 6 минут Первый вариант, пришедший в голову - изменять не visible, а alpha, однако это не лучший, на мой взгляд, вариант. |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 98
|
Спасибо, bav, ни за что бы не догадался, что visible=false по сути то же, что и MOUSE_OVER
|
|
|||||
|
in4core, объясните мне, малограмотному, что вы имели в виду под mouseChildren = false;, и где в первых четырех постах вы узрели холивар? Я смоделировал ситуацию следующим образом. Может я где-то ошибся и неверно понял автора топика?
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.EventPhase; public class TestProject extends Sprite { private var parentClip:Sprite; private var childClip:Sprite; public function TestProject() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(event:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); parentClip = new Sprite(); parentClip.graphics.lineStyle(1, 0, 1, true); parentClip.graphics.beginFill(0xFFFF00); parentClip.graphics.drawCircle(0, 0, 100); parentClip.graphics.endFill(); parentClip.x = parentClip.y = 100; childClip = new Sprite(); childClip.graphics.lineStyle(1, 0, 1, true); childClip.graphics.beginFill(0x00FFFF); childClip.graphics.drawCircle(0, 0, 50); childClip.graphics.endFill(); addChild(parentClip); parentClip.addChild(childClip); childClip.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler); childClip.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler); // Вот это напрямую к теме не относится. parentClip.addEventListener(MouseEvent.CLICK, parentClickHandler); } // Строчка "Parent" будет выводиться только в случае клика, собственно, // по родителю. private function parentClickHandler(event:MouseEvent):void { // Почитайте про фазы событий. if (event.eventPhase == EventPhase.AT_TARGET) trace("Parent."); } private function mouseOverHandler(event:MouseEvent):void { (event.target as DisplayObject).alpha = 0.01; } private function mouseOutHandler(event:MouseEvent):void { (event.target as DisplayObject).alpha = 1; } } } Andrei0077, возможно следующие объяснения будут излишни, но все же. visible = false – это задание значения свойству объекта. MOUSE_OVER – это тип события. Следовательно они не равнозначны. Когда вы устанавливаете visible в false, и при этом курсор расположен над объектом, мышь выходит за пределы объекта, тем самым инициируя событие MouseEvent.MOUSE_OUT. Последний раз редактировалось bav; 25.03.2011 в 12:48. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|