package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.geom.Rectangle; public class HitArea extends Sprite { public static const CLICK:String = "hitAreaClick"; public static const ROLL_OVER:String = "hitAreaRollOver"; public static const ROLL_OUT:String = "hitAreaRollOut"; private var _hitAreaRect:Rectangle; private var _rolledOver:Boolean; public function HitArea(width:Number, height:Number) { super(); mouseEnabled = mouseChildren = false; _hitAreaRect = new Rectangle(0, 0, width, height); addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler, false, 0, true); addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler, false, 0, true); } private function addedToStageHandler(event:Event):void { stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, false, 0, true); stage.addEventListener(MouseEvent.CLICK, click, false, 0, true); stage.addEventListener(Event.MOUSE_LEAVE, stageLeaveHandler, false, 0, true); } private function removedFromStageHandler(event:Event):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, false); stage.removeEventListener(MouseEvent.CLICK, click, false); stage.removeEventListener(Event.MOUSE_LEAVE, stageLeaveHandler, false); } private function mouseMoveHandler(event:MouseEvent):void { var mousePoint:Point = new Point(mouseX, mouseY); if (_hitAreaRect.containsPoint(mousePoint)) rollOver(); else rollOut(); } private function click(event:MouseEvent):void { if (_rolledOver) dispatchEvent(new Event(CLICK, true, true)); } private function stageLeaveHandler(event:Event):void { rollOut(); } private function rollOver():void { if (!_rolledOver) { _rolledOver = true; dispatchEvent(new Event(ROLL_OVER, true, true)); } } private function rollOut():void { if (_rolledOver) { _rolledOver = false; dispatchEvent(new Event(ROLL_OUT, true, true)); } } } }