/*----------------------------文档说明------------------------- * Flash中常用一些自制的形状代替鼠标形状进行一些操作,比如模拟画笔 * 用手的形状拖放、模拟颜料桶,这个时候如果不管理好鼠标监听器的注册 * 卸载,以及鼠标的隐藏和显示的话会有很多意向不到的后果出现。 * 这里写了一个监听器的注册管理函数,用来管理鼠标监听器的注册、卸载、显示 * 和隐藏。 * 首先定义了几个要用到的状态码,定义各种Object用于注册监听器,然后用 * RegMouse函数进行注册,该函数接收一个Number类型的参数,也就是要注册的监听器类型 * 该函数首先卸载当前注册的监听器,然后注册新的监听器,如果当前监听器和要注册的新监听器一样的话 * 就卸载当前监听器,并显示鼠标的默认状态。 * 本例子主要是在制作一个Flash模拟Windows画图板的时候写的,下面是其中的部分代码。 *----------------------------------------------------------------------*/ /*-------------- 鼠标状态定义------------ * */ var _cursorFlag:Number = 0;// 记录当前注册的鼠标监听器状态。 var _cursorObj:Object = new Object(); _cursorObj.def = 0; _cursorObj.drag = 1; _cursorObj.select = 2; _cursorObj.tong = 3; _cursorObj.pip = 4; /*----------状态码--------------------- * 0:默认状态,无任何形状,只能切换到其他状态后进行操作 * 1:手的形状,可以从物品栏中拖物品 * 2:选择状态,可以选择操作区中的东西 * 3:油漆桶状态,可以涂色 * 4:吸管状态,设置颜色 *------------------------------------- *----------------------------------------*/ // 按钮事件定义 /*--------------- 用于控制菜单消失的鼠标监听器-------- * 当菜单显示出来,并且在菜单之外的地方单击鼠标时,让菜单消失(主要是画图板工具栏上的菜单)* *--------------------------------------------------------------*/ var _mmListen:Object = new Object(); _mmListen.onMouseDown = function():Void { if (!menu_mc.hitTest(_xmouse, _ymouse)) { Mouse.addListener(drawObj); Mouse.removeListener(_mmListen); menu_mc.gotoAndStop(1); } }; // 点击颜料桶时注册监听器 var dmtong:Object = new Object(); dmtong.onMouseMove = function():Void { dmtong_mc._x = _xmouse; dmtong_mc._y = _ymouse; }; // 吸管工具 var dmpip:Object = new Object(); dmpip.onMouseMove = function():Void { dmpip_mc._x = _xmouse; dmpip_mc._y = _ymouse; }; // 选择工具 var dmselect:Object = new Object(); dmselect.onMouseMove = function():Void { dmcursor_mc._x = _xmouse; dmcursor_mc._y = _ymouse; }; // 画线工具 line_mc.clear(); var drawObj:Object = new Object(); drawObj.x1 = 0; drawObj.y1 = 0; drawObj.x2 = 0; drawObj.y2 = 0; drawObj.xx = 0; drawObj.yy = 0; drawObj.drawFlag = false; drawObj.moveFlag = false; drawObj.startFlag = false; drawObj.moveMC = new Array(); var plasterFlag:Boolean = false; drawObj.onMouseDown = function():Void { // 如果在操作区之外按下鼠标,则返回 if (_xmouse <= 68 || _xmouse >= 400 || _ymouse >= 260 || _ymouse <= 55) { return; } // 如果当前状态是不是移动选中的物品,则记录按下位置,用来画线 if (drawObj.moveFlag != true) { drawObj.x1 = _xmouse; drawObj.y1 = _ymouse; drawObj.drawFlag = true; } else { drawObj.xx = _xmouse; drawObj.yy = _ymouse; drawObj.moveMC = new Array(); selectRect(); } drawObj.startFlag = true; }; drawObj.onMouseUp = function():Void { if (drawObj.moveFlag != true) { drawObj.x2 = _xmouse; drawObj.y2 = _ymouse; if (drawObj.x1 == _xmouse && drawObj.y1 == _ymouse) { line_mc.clear(); } else { dmcursor_mc.nextFrame(); } drawObj.drawFlag = false; } drawObj.startFlag = false; trace("x1 = " + drawObj.x1); }; // 单鼠标在选中区域内时,变成移动图标,否则变成选择图标。 line_mc.onEnterFrame = function():Void { if (_cursorFlag == _cursorObj.select && drawObj.x1 != drawObj.x2 && drawObj.y1 != drawObj.y2 && drawObj.startFlag == false) { if ((_xmouse - drawObj.x1) * (_xmouse - drawObj.x2) < 0 && (_ymouse - drawObj.y1) * (_ymouse - drawObj.y2) < 0) { drawObj.moveFlag = true; drawObj.drawFlag = false; dmcursor_mc.gotoAndStop(2); } else { drawObj.moveFlag = false; drawObj.drawFlag = true; dmcursor_mc.gotoAndStop(1); } } }; drawObj.onMouseMove = function():Void { trace(drawObj.startFlag); if (_cursorFlag == _cursorObj.select && drawObj.startFlag == true) { if (drawObj.moveFlag == true) { // 移动 if (drawObj.x1 + (_xmouse - drawObj.xx) < 65 || drawObj.x1 + (_xmouse - drawObj.xx) > 400 || drawObj.x2 + (_xmouse - drawObj.xx) < 65 || drawObj.x2 + (_xmouse - drawObj.xx) > 400 || drawObj.y1 + (_ymouse - drawObj.yy) < 50 || drawObj.y1 + (_ymouse - drawObj.yy) > 260 || drawObj.y2 + (_ymouse - drawObj.yy) < 50 || drawObj.y2 + (_ymouse - drawObj.yy) > 260) { return; } for (var mm in drawObj.moveMC) { drawObj.moveMC[mm]._x += _xmouse - drawObj.xx; drawObj.moveMC[mm]._y += _ymouse - drawObj.yy; drawObj.moveMC[mm].x = drawObj.moveMC[mm]._x; drawObj.moveMC[mm].y = drawObj.moveMC[mm]._y; } drawObj.x1 += _xmouse - drawObj.xx; drawObj.y1 += _ymouse - drawObj.yy; drawObj.x2 += _xmouse - drawObj.xx; drawObj.y2 += _ymouse - drawObj.yy; drawObj.xx = _xmouse; drawObj.yy = _ymouse; } else { drawObj.x2 = _xmouse; drawObj.y2 = _ymouse; } drawRect(); } else { } }; // 手型图标 var handObj:Object = new Object(); handObj.onMouseMove = function():Void { hand_mc._x = _xmouse; hand_mc._y = _ymouse; }; hand_btn.onRelease = function():Void { RegMouse(_cursorObj.drag); }; // 鼠标监听器注册管理函数 function RegMouse(regID:Number):Void { if (regID < 0 || regID > 4) { return; } // 清除上次的 switch (_cursorFlag) { case _cursorObj.def : Mouse.hide(); break; case _cursorObj.drag : hand_mc._x = hand_mc._y = -500; Mouse.removeListener(handObj); break; case _cursorObj.select : dmcursor_mc._x = dmcursor_mc._y = -500; select_mc.gotoAndStop(1); line_mc.clear(); Mouse.removeListener(drawObj); Mouse.removeListener(dmselect); break; case _cursorObj.tong : dmtong_mc._x = dmtong_mc._y = -500; tong_mc.gotoAndStop(1); Mouse.removeListener(dmtong); break; case _cursorObj.pip : dmpip_mc._x = dmpip_mc._y = -500; pip_mc.gotoAndStop(1); Mouse.removeListener(dmpip); break; } if (_cursorFlag == regID) { _cursorFlag = 0; Mouse.show(); return; } // 注册新的监听器 switch (regID) { case _cursorObj.def : Mouse.show(); break; case _cursorObj.drag : hand_mc._x = _xmouse; hand_mc._y = _ymouse; Mouse.addListener(handObj); break; case _cursorObj.select : dmcursor_mc._x = _xmouse; dmcursor_mc._y = _ymouse; Mouse.addListener(drawObj); Mouse.addListener(dmselect); break; case _cursorObj.tong : dmtong_mc._x = _xmouse; dmtong_mc._y = _ymouse; Mouse.addListener(dmtong); break; case _cursorObj.pip : dmpip_mc._x = _xmouse; dmpip_mc._y = _ymouse; Mouse.addListener(dmpip); break; } _cursorFlag = regID; }
Flash管理鼠标监听器[ActionScript]
最新推荐文章于 2020-05-05 08:39:15 发布