DragOver Event in Flex and Air

ก็เนื่องจากงานที่ต้องทำ มันมีการเขียน Code หาตำแหน่ง MouseY ในส่วนของฟังก์ชั้น DragOverHandler ซึ่งมันก็ทำงานปกติใน Web Application (ใช้ Flash player) แต่เมื่อเอามารันบน Air ปรากฏว่า มันดันหาค่าพิกัด Y ออกมาเป็นค่าคงที่ตลอด ก็เลยงง ทำไมรันบน flash มันเวิร์ก แต่พอมารันบน air กลับไม่เวิร์ก

addEventListener(DragEvent.DRAG_OVER, dragOverHandler);

private function dragOverHandler(event:DragEvent):void{
trace(“MouseY: ” + mouseY);
}


ข้อแตกต่างเลยสิ่งแรกใน flash เวลารัน มันในโหมดดีบัก จะเห็นได้ว่ามีการโชว์เจ้า track ออกมาก็ต่อเมื่อ เม้าส์ over เข้าไปใน component แล้วก็เมาส์เลื่อนด้วยคับ ถ้าหากว่าเมาส์ ไม่ได้เลื่อน ก็จะไม่ dispatch event ออกมา ต่างกับ air เมื่อเมาส์เรา over เข้าไปใน component ก็จะ dispatch event ออกมาเรื่อยๆ ไม่ว่าจะเลื่อนเมาส์หรือไม่ก็ตาม จะหยุดก็ต่อเมื่อ เมาส์ exit ออกไปจาก component แล้ว และที่สำัคัญ ค่าของเจ้า mouseY และ mouseX จะไม่เปลี่ยนแปลง นั่นก็คือ ครั้งแรกมัน dispatch event ได้ค่า mouseX และ mouseY ค่าอะไร มันก็จะ dispatch ค่านั่นออกมาตลอด

เหอะๆ ไอเราก็กะว่าตอนแรก จะหาทางไม่ให้มัน dispatch event ออกมาตลอด กะเปลี่ยนไปใช้
DragEvent.DRAG_ENTER แล้ว add MouseEvent.MOUSE_MOVE เข้าไป เพื่อให้ได้พิกัน MouseY แล้วในจังหวะที่เป็น DragEvent.DRAG_EXIT ค่อย remove MouseEvent.MOUSE_MOVE ออก

addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
addEventListener(DragEvent.DRAG_EXIT, dragEnterHandler);

private function dragEnterHandler(event:DragEvent):void{
trave(“ENTER”)
addEventListener(MuseEvent.MOUSE_MOVE, mouseMovehandler);
}
private function dragExitHandler(event:DragEvent):void{
trace(“EXIT”)
removeListener(MouseEvent.MOUSE_MOVE, mouseMovehandler);
}
private function mouseMoveHandler(event:MouseEvent):void{
trace(“MOVE”)
}

ปรกฏว่าเมื่อเมาส์ enter เข้าไป มันก็ trace message “ENTER” ออกมา แต่ว่าเวลาเราเลื่อนเมาส์ มันกลับไม่พิมพ์ “MOVE” ออกมาเลย และเวลาเราเอาเมาส์ออกจาก component มันก็พิมพ์ “EXIT” – -*
แต่ว่าหากเราเอาเมาส์เข้าไปใน component แล้ว ปล่อยคลิ๊กหละก้อ มันก็จะพิมพ์ “MOVE” ๆๆๆๆ ออกมาเรื่อยๆ เหมือนมันพึ่งจะ add MouseMove ให้เรา – -*

จนต้องหาทางแก้สุดท้าย เข้าไปใช้ ตัวแปรของ DragEvent ซึ่งก็คือ localX และ localY เพื่อหาค่าพิกัน X, Y นั่นเอง แต่ว่าค่าทีไ่ด้เป็นค่าที่อ้างอิงจากพิกัดของ Component นั้นๆ

ลองต่อไป คงต้องกลับไปอ่าน flex doc ดูใหม่อีกแระ