Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动
对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象,这startDrag/stopDrag是不能用的,这时候只能采用最通常用做法:利用Mouse_Down,Mouse_UP,Mouse_Move事件来处理
注意:对象的Mouse_Move事件,只有当鼠标在对象上时才能被监听,如果用户鼠标移动过快,超出了对象的范围,该事件就不起作用了,所以监听Mouse_Move事件时,应该监听stage对象的Mouse_Move事件,而非对象本身的(详情见下面的代码)
01 package {
02 import flash.display.Sprite;
03 import flash.events.MouseEvent;
04 import flash.ui.MouseCursor;
05 import flash.ui.Mouse;
06
07 public class MouseMoveDrag extends Sprite {
08
09 private var offsetX:Number;
10 private var offsetY:Number;
11 private var arrBalls:Array;
12 private var _draggedBall:Ball;
13
14
15 public function MouseMoveDrag():void {
16
17 arrBalls=new Array(7);
18
19 for (var i:uint=0; i<arrBalls.length; i++) {
20 arrBalls[i]=new Ball(20+Math.random()*30,Math.random()*0xffffff);
21 arrBalls[i].x=stage.stageWidth*Math.random();
22 arrBalls[i].y=stage.stageHeight*Math.random();
23 arrBalls[i].addEventListener(MouseEvent.MOUSE_DOWN, MouseDownHandler);
24 arrBalls[i].addEventListener(MouseEvent.MOUSE_UP, MouseUpHandler);
25 arrBalls[i].addEventListener(MouseEvent.MOUSE_OVER,MouseOverHandler);
26 arrBalls[i].addEventListener(MouseEvent.MOUSE_OUT,MouseOutHandler);
27 addChild(arrBalls[i]);
28 }
29
30 }
31
32 function MouseOverHandler(e:MouseEvent):void {
33 Mouse.cursor=MouseCursor.BUTTON;
34 }
35
36 function MouseOutHandler(e:MouseEvent):void {
37 Mouse.cursor=MouseCursor.AUTO;
38 }
39
40 //开始移动
41 function MouseDownHandler(e:MouseEvent):void {
42 offsetX=e.localX;
43 offsetY=e.localY;
44 _draggedBall = e.target as Ball;
45 stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler);
46 }
47
48 //停止拖动
49 function MouseUpHandler(e:MouseEvent):void {
50 _draggedBall = null;
51 //拖动完成后,移除舞台的Mouse_Move监听
52 stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler);
53 }
54
55
56 function stageMouseMoveHandler(e:MouseEvent):void {
57 //trace(e.target);
58 var _ball:Ball=e.target as Ball;
59 if (_ball!=null) {
60 //设置新的坐标
61 _ball.x=mouseX-offsetX;
62 _ball.y=mouseY-offsetY;
63 }
64 else {
65 //trace("您拖得太快了!" + _draggedBall.toString());
66 if (_draggedBall!=null){
67 _draggedBall.x=mouseX-offsetX;
68 _draggedBall.y=mouseY-offsetY;
69 }
70 }
71 }
72
73 }
74 }
浙公网安备 33010602011771号