Recipe 1.6.
Responding to Mouse and Key Events
Problem
You want to do something in response to a
mouse or keyboard action.
Solution
Listen for and handle mouse or key events.
Discussion
Handling mouse and key events is very similar to
handling the enterFrame
event, as discussed in the Recipe
1.5, but does require a little work. For mouse events, the main
application class will not receive these directly, so it must
listen for them on another object in the display list. (For a
complete discussion of the display list, see Chapter
5.) The following example creates a sprite, adds it to the
display list, and draws a rectangle in it:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class ExampleApplication extends Sprite {
private var _sprite:Sprite;
public function ExampleApplication( ) {
_sprite = new Sprite( );
addChild(_sprite);
_sprite.graphics.beginFill(0xffffff);
_sprite.graphics.drawRect(0, 0, 400, 400);
_sprite.graphics.endFill( );
Note that the mouse event names are defined in
the MouseEvent class,
and the handler methods get passed an instance of the
MouseEvent class, so you'll need to import that class. Then
you can add mouse listeners to this sprite:
_sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
_sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
Next, define the two handler methods,
onMouseDown and
onMouseUp:
private function onMouseDown(event:MouseEvent):void {
_sprite.graphics.lineStyle(1, 0, 1);
_sprite.graphics.moveTo(mouseX, mouseY);
_sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
private function onMouseUp(event:MouseEvent):void
{
_sprite.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
The onMouseDown methods sets a drawing
line style on the new sprite and moves the drawing cursor to the
mouse position. It then adds yet a third mouse listener for the
MouseMove event.
The onMouseUp methods removes that
listener via the removeEventListener method. This has the
same syntax as addEventListener, but tells the class to stop
listening to the specified event.
Finally, define onMouseMove and close
up the class and package:
private function onMouseMove(event:MouseEvent):void {
_sprite.graphics.lineTo(mouseX, mouseY);
}
}
}
This creates a simple event-driven drawing
program.
Keyboard events are a little easier to handle.
The only requirement for listening and responding to keyboard
events is that the object that receives the events must have focus.
You do this for the main application by adding the line:
stage.focus = this;
The following example shows a simple class that
listens for the keyDown
event and traces out the character code for that key. This also
demonstrates how to use some of the data contained in the event
object passed to the handler method. Note that keyboard events use
the class KeyboardEvent.
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
public class ExampleApplication extends Sprite {
public function ExampleApplication( ) {
stage.focus = this;
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onKeyDown(event:KeyboardEvent):void {
trace("key down: " + event.charCode);
}
}
}
See Also
Recipe
1.5
|