Вопрос по mouseevent, actionscript-3, button, movieclip – AS3 - кнопка внутри MovieClip запускает событие MC

2

На сцене у меня есть MovieClip под названием "mc" с простым прямоугольником, нарисованным внутри. У mc также есть дочерний элемент Button с именем & quot; btn & quot; это другой простой прямоугольник (очевидно, меньше, чем прямоугольник mc). Тогда у меня есть этот код на сцене.

function mcDown( _e:MouseEvent):void{
    trace( "mc" );
}
function btnClick( _e:MouseEvent):void{
    trace( "btn" );
}
mc.addEventListener( MouseEvent.MOUSE_DOWN, mcDown );
mc.btn.addEventListener( MouseEvent.CLICK, btnClick );

Проблема, с которой я сталкиваюсь, заключается в том, что при нажатии кнопки также запускается событие mcDown, которое отслеживает как "mc" и "btn".

Как сделать так, чтобы при нажатии на кнопку запускалась только btnClick, а не mcDown? Я попробовал MOUSE_UP вместо CLICK, та же проблема. И событие mcDown должно оставаться MOUSE_DOWN.

Ваш Ответ

2   ответа
1

за исключением того, что в диспетчере dispatchEvent для параметра пузырей указано значение false.

dispatchEvent(EVENT_TYPE, BUBBLES,....);

Тем не менее, вы можете избежать пузырей, выполнив проверку. Просто используйте нижнюю строку в качестве первой строки функции слушателя, чтобы избежать событий, отправляемых из всех объектов, кроме целей.

if(e.eventPhase != EventPhase.AT_TARGET) return;

Итак, для вашего примера кода, когда вы нажимаете на кнопку, оба события отправляются, но вmcDown функция, которую он не выполнит после указанной выше строки.

Добро пожаловать:)
Спасибо, это похоже на одну проверку! Murat
0

вы также нажимаете на MC, поскольку та часть MC, которая находится под кнопкой, все еще там, и она выполняет функцию для всего MC, вы можете & apos удалить его.

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

Этот должен сделать это.

//add this in you constructor

mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc);
function myReleaseFunc(e:MouseEvent):void {
    if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button
    {
         Btn_func1();
    }
    else if(e.currentTarget.name == Btn2) //Btn2 is another button.
    {
         Btn_func2();
         //For every button you'll need to add another function and if statement to check if that button was clicked.
    }
    else
    {
         Mc_func();
    }

} 

// this outside the main class

function Mc_func():void{
    //you code here
}
function Btn_func1():void{
    //you code here
}
function Btn_func2():void{
    //you code here
}

Я думаю, что этот способ намного более эффективен, он будет работать лучше и быстрее, и у вас будет намного меньше шансов перегрузить систему.

Я не могу понять, почему это не сработает. Если 'mc' имя не изменит ничего, поэтому было бы хорошо дать ему имя экземпляра. Также этот код может использоваться бесконечным количеством объектов. Вам просто нужно добавить несколько строк на объект. Смотрите на обновление.
Спасибо за ответ, по крайней мере, теперь я знаю, что это не так, как я надеялся. Однако, к сожалению, я не могу использовать ваш метод, потому что & quot; mc & quot; будет безымянным в реальном проекте и будет иметь больше дочерних кнопок и различного типа интерактивного контента. Думаю, мне придется придерживаться моего первого плана. Я создаю невидимую кнопку 1x1 в & quot; mc & quot; ниже всего и добавьте к нему событие mcDown. Затем я установил его свойства scaleX и scaleY на любую ширину и высоту, что и "mc". есть. Я надеялся, что смогу достичь этого без этой дополнительной кнопки, но, похоже, проще всего было. Murat
Я попытался упростить проблему под рукой. В реальном проекте "mc" Экземпляры клипа сначала создаются как пустые клипы и добавляются динамически, их может быть больше одного. И у детей может быть очень много разных вещей, просто невозможно добавить их всех, было бы слишком много лишних строк. Может быть, если & quot; mc & quot; клип находится в библиотеке и имеет класс связывания, вместо имени, который класс может использовать getQualifiedClassName () или что-то в этом роде. Если имя класса отличается от mc, используйте return to abort. Murat

Похожие вопросы