📄 virtualmouse.as.svn-base
字号:
* Locks the current VirtualMouse instance
* preventing updates from being made as
* properties change within the instance.
* To release and allow an update, call unlock().
* @see lock()
* @see update()
*/
public function lock():void {
isLocked = true;
}
/**
* Unlocks the current VirtualMouse instance
* allowing updates to be made for the
* dispatching of virtual mouse events. After
* unlocking the instance, it will update and
* additional calls to press(), release(), or
* changing the location of the virtual mouse
* will also invoke updates.
* @see lock()
* @see update()
*/
public function unlock():void {
isLocked = false;
update();
}
/**
* Allows you to disable an event by type
* preventing the virtual mouse from
* dispatching that event during an update.
* @param type The type for the event to
* disable, e.g. MouseEvent.CLICK
* @see enableEvent()
*/
public function disableEvent(type:String):void {
disabledEvents[type] = true;
}
/**
* Re-enables an event disabled with
* disableEvent.
* @param type The type for the event to
* enable, e.g. MouseEvent.CLICK
* @see disableEvent()
*/
public function enableEvent(type:String):void {
if (type in disabledEvents) {
delete disabledEvents[type];
}
}
/**
* Ignores a display object preventing that
* object from recieving events from the
* virtual mouse. This is useful for instances
* used for cursors which may always be under
* the virtual mouse's location.
* @param instance A reference to the
* DisplayObject instance to ignore.
* @see unignore()
*/
public function ignore(instance:DisplayObject):void {
ignoredInstances[instance] = true;
}
/**
* Removes an instance from the ignore list
* defined by ignore(). When an ingored
* object is passed into unignore(), it will
* be able to receive events from the virtual
* mouse.
* @param instance A reference to the
* DisplayObject instance to unignore.
* @see ignore()
*/
public function unignore(instance:DisplayObject):void {
if (instance in ignoredInstances){
delete ignoredInstances[instance];
}
}
/**
* Simulates the pressing of the left
* mouse button. To release the mouse
* button, use release().
* @see release()
* @see click()
*/
public function press():void {
//if (_mouseIsDown) return;
updateMouseDown = true;
_mouseIsDown = true;
if (!isLocked) update();
}
/**
* Simulates the release of the left
* mouse button. This method has no
* effect unless press() was called first.
* @see press()
* @see click()
*/
public function release():void {
//if (!_mouseIsDown) return;
updateMouseDown = true;
_mouseIsDown = false;
if (!isLocked) update();
}
/**
* Simulates a click of the left
* mouse button (press and release)
* @see press()
* @see release()
* @see click()
* @see doubleClick()
*/
public function click():void {
press();
release();
}
/**
* Simulates a double-click of the left
* mouse button (press and release twice).
* Calling this command is the only way to
* simulate a double-click for the virtual
* mouse. Calling press() and release() or
* click() is rapid succession will not
* invoke a double-click event. The double-click
* event will also only fire for an instance
* if it's doubleClickEnabled property is
* set to true.
* @see click()
*/
public function doubleClick():void {
// if locked, doubleClick will
// not fire but the mouse will
// be released if not already
if (isLocked) {
release();
}else{
// call update with a click, press, then release
// and double-click notification for release
click();
press();
isDoubleClickEvent = true;
release();
isDoubleClickEvent = false;
}
}
/*Added by Jim Kremens kremens@gmail.com 08/16/07 */
public function exitContainer():void {
var targetLocal:Point = target.globalToLocal(location);
if (!disabledEvents[MouseEvent.MOUSE_OUT]) {
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_OUT, true, false, targetLocal.x, targetLocal.y, container, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
container.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (!disabledEvents[MouseEvent.ROLL_OUT]) { // rolls do not propagate
_lastEvent = new mouseEventEvent(MouseEvent.ROLL_OUT, false, false, targetLocal.x, targetLocal.y, container, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
container.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (target != container) {
if (!disabledEvents[MouseEvent.MOUSE_OUT]) {
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_OUT, true, false, targetLocal.x, targetLocal.y, container, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
target.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (!disabledEvents[MouseEvent.ROLL_OUT]) { // rolls do not propagate
_lastEvent = new mouseEventEvent(MouseEvent.ROLL_OUT, false, false, targetLocal.x, targetLocal.y, container, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
target.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
}
//reset the target to the stage, which is the value it starts at.
target = _stage;
}
/**
* Updates the VirtualMouse instance's state
* to reflect a change in the virtual mouse.
* Within this method all events will be dispatched.
* update() is called any time a VirtualMouse
* property is changed unless lock() was used to
* lock the instance. update() will then not be
* called until unlock() is used to unlock
* the instance. Typically you would never call
* update() directly; it is called automatically
* by the VirtualMouse class. Calling update()
* manually will override lock(). Whenever update()
* is called, the UPDATE event is dispatched.
* @see lock()
* @see unlock()
*/
public function update():void {
// dispatch an update event indicating that
// an update has occured
dispatchEvent(new Event(UPDATE, false, false));
}
private function handleUpdate(event:Event):void
{
if (!container) return;
// go through each objectsUnderPoint checking:
// 1) is not ignored
// 2) is InteractiveObject
// 3) mouseEnabled
// 4) all parents have mouseChildren
// if not interactive object, defer interaction to next object in list
// if is interactive and enabled, give interaction and ignore rest
var objectsUnderPoint:Array = container.getObjectsUnderPoint(location);
var currentTarget:InteractiveObject;
var currentParent:DisplayObject;
var i:int = objectsUnderPoint.length;
while (i--) {
currentParent = objectsUnderPoint[i];
// go through parent hierarchy
while (currentParent) {
// don't use ignored instances as the target
if (ignoredInstances[currentParent]) {
currentTarget = null;
break;
}
// invalid target if in a SimpleButton
if (currentTarget && currentParent is SimpleButton)
{
//log.debug("found SimpleButton - setting currentTarget to null");
currentTarget = null;
// invalid target if a parent has a
// false mouseChildren
} else if (currentTarget && !DisplayObjectContainer(currentParent).mouseChildren)
{
//log.debug("parent false mouseChildren - setting currentTarget to null");
currentTarget = null;
}
// define target if an InteractiveObject
// and mouseEnabled is true
if (!currentTarget && currentParent is InteractiveObject && InteractiveObject(currentParent).mouseEnabled)
{
//log.debug("found InteractiveObject && mouseEnabled = true - setting currentTarget");
currentTarget = InteractiveObject(currentParent);
}
// next parent in hierarchy
currentParent = currentParent.parent;
}
// if a currentTarget was found
// ignore all other objectsUnderPoint
if (currentTarget){
break;
}
}
// if a currentTarget was not found
// the currentTarget is the stage
if (!currentTarget){
currentTarget = _stage;
log.debug("no new target found, using stage");
}
// get local coordinate locations
var targetLocal:Point = target.globalToLocal(location);
var currentTargetLocal:Point = currentTarget.globalToLocal(location);
// move event
if (lastLocation.x != location.x || lastLocation.y != location.y)
{
var withinStage:Boolean = false;
if(stage) withinStage = (location.x >= 0 && location.y >= 0 && location.x <= stage.stageWidth && location.y <= stage.stageHeight);
// mouse leave if left stage
if (!withinStage && lastWithinStage && !disabledEvents[Event.MOUSE_LEAVE]){
_lastEvent = new eventEvent(Event.MOUSE_LEAVE, false, false);
stage.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// only mouse move if within stage
if (withinStage && !disabledEvents[MouseEvent.MOUSE_MOVE]){
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_MOVE, true, false, currentTargetLocal.x, currentTargetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// remember if within stage
lastWithinStage = withinStage;
}
// roll/mouse (out and over) events
if (currentTarget != target)
{
// off of last target
if (!disabledEvents[MouseEvent.MOUSE_OUT]){
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_OUT, true, false, targetLocal.x, targetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
target.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (!disabledEvents[MouseEvent.ROLL_OUT]){ // rolls do not propagate
_lastEvent = new mouseEventEvent(MouseEvent.ROLL_OUT, false, false, targetLocal.x, targetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
target.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// on to current target
if (!disabledEvents[MouseEvent.MOUSE_OVER]){
//log.debug("*** MOUSEOVER****");
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_OVER, true, false, currentTargetLocal.x, currentTargetLocal.y, target, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (!disabledEvents[MouseEvent.ROLL_OVER]){ // rolls do not propagate
//log.debug("*** ROLLOVER****");
_lastEvent = new mouseEventEvent(MouseEvent.ROLL_OVER, false, false, currentTargetLocal.x, currentTargetLocal.y, target, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
}
// click/up/down events
if (updateMouseDown) {
if (_mouseIsDown) {
if (!disabledEvents[MouseEvent.MOUSE_DOWN]){
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_DOWN, true, false, currentTargetLocal.x, currentTargetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// remember last down
lastDownTarget = currentTarget;
updateMouseDown = false;
// mouse is up
}else{
if (!disabledEvents[MouseEvent.MOUSE_UP]){
_lastEvent = new mouseEventEvent(MouseEvent.MOUSE_UP, true, false, currentTargetLocal.x, currentTargetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
if (!disabledEvents[MouseEvent.CLICK] && currentTarget == lastDownTarget) {
_lastEvent = new mouseEventEvent(MouseEvent.CLICK, true, false, currentTargetLocal.x, currentTargetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// clear last down
lastDownTarget = null;
updateMouseDown = false;
}
}
// explicit call to doubleClick()
if (isDoubleClickEvent && !disabledEvents[MouseEvent.DOUBLE_CLICK] && currentTarget.doubleClickEnabled) {
_lastEvent = new mouseEventEvent(MouseEvent.DOUBLE_CLICK, true, false, currentTargetLocal.x, currentTargetLocal.y, currentTarget, ctrlKey, altKey, shiftKey, _mouseIsDown, delta);
currentTarget.dispatchEvent(_lastEvent);
dispatchEvent(_lastEvent);
}
// remember last values
lastLocation = location.clone();
lastMouseDown = _mouseIsDown;
target = currentTarget;
}
private function keyHandler(event:KeyboardEvent):void {
// update properties used in MouseEvents
altKey = event.altKey;
ctrlKey = event.ctrlKey;
shiftKey = event.shiftKey;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -