6.8.接收鼠标事件

问题
我要让动画接收鼠标命令
解决办法
使用各种鼠标事件监听鼠标动作,并作出反应。使用DisplayObject 实例的只读属性mouseX 和mouseY检查鼠标相对位置,或者MouseEvent事件的localX 和localY 属性。
讨论
6.5节讨论的SimpleButton 类已经实现了最基本的鼠标交互。SimpleButton 类提供了简单的方法利用不同的对象状态创建鼠标交互按钮。

但是鼠标事件不仅仅只有这些,监听各种鼠标事件可以创建更加丰富的交互体验。比如你想在绘图程序中跟踪鼠标轨迹,随着用户鼠标的移动在屏幕上绘制线条,或者有一个迷宫程序,需要用鼠标做导航来走出迷宫,或者更多的复杂情况。

这些情况都需要使用特殊的InteractiveObject 可视化对象,它提供了响应用户鼠标的能力。如果回过头来看那张可视化对象层级图,你会发现InteractiveObject 类处在很高的层上,那些Sprite,Loader, TextField, 和MovieClip 类都在它的下面。

InteractiveObject 实例发出必要的鼠标事件,下面是些常用的鼠标事件:
click
当用户在显示的物体上单击鼠标时触发。
doubleClick
当用户在显示物体上双击鼠标时触发。
mouseDown
当用户在显示物体上按下鼠标键时触发。
mouseUp
当用户松开鼠标时触发
mouseOver
当用户移动鼠标到物体上时触发
mouseMove
当用户在物体上移动鼠标触发。
mouseOut
当用户移动鼠标离开物体时触发。
mouseWheel
当用户在物体上使用鼠标滚轮时触发。

使用InteractiveObject的addEventListener( ) 方法注册鼠标事件并定义MouseEvent事件处理函数。

下面的代码创建了一个Sprite, 画了个红色的圆,当鼠标移动到园上时在控制台输出信息。
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.events.*;
import flash.geom.Point;
public class InteractiveMouseDemo extends Sprite {
public function InteractiveMouseDemo( ) {
var circle:Sprite = new Sprite( );
circle.x = 10;
circle.y = 10;
circle.graphics.beginFill( 0xFF0000 );
circle.graphics.drawCircle( 0, 0, 5 );
circle.graphics.endFill( );
circle.addEventListener( MouseEvent.MOUSE_MOVE, handleMouseMove );
addChild( circle );
}
private function handleMouseMove( event:MouseEvent ):void {
trace( "mouse move" );
}
}
}

我们看到当鼠标在园上移动时,控制台上不同的输出“mouse move”。

另一个经常用的鼠标事件,就是鼠标的定位。比如说用鼠标画一条线,需要知道在哪里画线,也就是要得到鼠标的位置。这里有两种方法得到鼠标的位置:

使用DisplayObject实例的mouseX 和mouseY 属性
通过鼠标事件中MouseEvent 实例localX 和localY 属性。
mouseX 和mouseY 属性指示鼠标相对于DisplayObject对象左上角的坐标。这两个属性是只读的,不能被设置,只能检查鼠标位置。

想象一下如果有个矩形在x坐标为20 和y坐标为50 的地方,而鼠标的位置为x坐标25和y坐标60。那么矩形的mouseX 属性返回5,mouseY属性返回10。

MouseEvent 的localX 和localY 属性也是相对值。它是相对于激活事件的对象位置。当矩形返回mouseX 为10时发出mouseMove 事件,事件的localX 属性也是10。

如果想从本地坐标中获得全局坐标, 可用DisplayObject 类的localToGlobal( ) 方法。

localToGlobal( ) 方法以flash.geom.Point 作为参数,返回新的Point 对象。下面的代码演示了事件处理和如何把localX 和localY 转换为全局坐标:
+展开
-ActionScript
// Event handler to respond to a mouseMove event
private function handleMouseMove( event:MouseEvent ):void {
/* 显示:
local x: 3.95
local y: 3.45
*/

trace( "local x: " + event.localX );
trace( "local y: " + event.localY );
// 创建point
var localPoint:Point = new Point( event.localX, event.localY );
// 得到全局坐标
var globalPoint:Point = event.target.localToGlobal( localPoint );
/* 显示:
global x: 13.95
global y: 13.45
*/

trace( "global x: " + globalPoint.x );
trace( "global y: " + globalPoint.y );
}

下面的完整例子通过一个绘图程序演示了各种鼠标事件,无论何时鼠标按下,绘图将立即开始,当移动鼠标,一条线跟着鼠标显示出来,当松开鼠标,绘图终止:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class DrawingDemo extends Sprite {
// Flag to indicate whether the mouse is in draw mode
private var _drawing:Boolean;
public function DrawingDemo( ) {

// 设置线条样式
graphics.lineStyle( 2, 0xFFCC33 );
// 按住鼠标就绘图
_drawing = false;
// 监听鼠标事件
stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
stage.addEventListener( MouseEvent.MOUSE_MOVE, draw );
stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
}
public function startDrawing( event:MouseEvent ):void {
// 绘制起点
graphics.moveTo( mouseX, mouseY );
_drawing = true;
}
public function draw( event:MouseEvent ):void {
if ( _drawing ) {
// 鼠标走到哪画到哪
graphics.lineTo( mouseX, mouseY );
}
}
public function stopDrawing( event:MouseEvent ):void {
_drawing = false;
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(142)喜欢(0)flash/flex/fcs/AIR