*Време е да започна да пиша малко пак и по по-професионални теми.
Днес в работа научих нещо сравнително полезно, ха да го споделя.
Ако сте писали на ActionScript2 сигурно помните хубавата функцийка stopDrag(); дето спира да драги всичко живо по сцента. В AS3 обаче, това стана метод на Sprite/MovieClip. Така, хубаво можете да почнете да си влачите нещо при MOUSE_DOWN, и да спрете да си го влачите при MOUSE_UP. Обаче, както често се случва, MOUSE_UP Еvent-a се извика не за вашия клип, а за този, който е под курсора в момента (ако някой си влачи мишката фриволно, това е честа ситуация). Така получаваме разни скролове, снимки и джунджурии които се влачат по курсора и когато не трябва, всичко е бъгаво грозно и сакато.
Решение е да се опишат всички възможни Object.stopDrag() за всички възможни получатели на MOUSE_UP. Това обаче е твърде трудоемко и често става много времеотнемащо. След като ни взеха глобалния stopDrag(), сегашния спира само за по едно обектче.
Това, което трябва да се сетия човек е да прочете спецификацията, в която пише, че макар и Obj.stopDrag() да спира драгенето за един обект, startDrag() го спира за всички (по-лесно е да се намери логика в Prolog, от колкото в това) 🙂
Ето и едно супер просто решение на проблема с не-спиращите да се влачат по курсора обекти : aбонираме клипа, държащ всичко на сцената (всички знаем, че цялото съдържание във Флаш нещо трябва да си има holder клип, нали 🙂 ) за MouseEvent.MOUSE_UP. Заради пропагандирането на събитията, където и да е възникнал този Event, той все ще достигне до holder-a.
Трябва да си направим и един fake movie clip / sprite в този holder. Това, което е нужно е, когато прихванем такъв Event (a.k.a MouseEvent.MOUSE_UP) от и да кажем например :
//import bla-bla
pageHolder.addEventListener(MouseEvent.MOUSE_UP,StopAllDrag);
function StopAllDrag(e:MouseEvent):void{
pageHolder.startDrag(pageHolder.fakeMovieClip_mc,new Rectangle(1,1,1,1));
pageHolder.fakeMovieClip.stopDrag();
}
Това супер естествено и очаквано начиние – да спираме драгването на каквото и да било със startDrag() спестява тонове код и главоболия.
Сполай и goodLuck с ActionScript-a.
*къдеот пише Event, може да се чете MouseEvent, понеже MouseEvent-a е Event, нали .. и дали е MovieClip или Sprite все тая too.