有人知道如何在空中应用程序中捕获鼠标。我知道它可能,因为flex滚动条捕获鼠标。我想复制滚动条的鼠标捕获。
在弹性/空气应用程序窗口中尝试:
<s:Scroller height="500" width="300">
<s:VGroup>
<s:Rect width="100%" height="2000">
<s:fill>
<s:SolidColor color="#ffcc00"/>
</s:fill>
</s:Rect>
</s:VGroup>
</s:Scroller>
如果按住滚动条手柄并向外拖动,即使在窗口外,滚动条仍可正常工作。它不会失去焦点。所以它正在捕捉鼠标。
我想要的是什么:
答案 0 :(得分:0)
至少在使用鼠标的台式机上,据我所知,这应该是Just Work。例如:
import flash.text.TextField;
import flash.events.MouseEvent;
var t:TextField = new TextField();
stage.addChild(t);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouse);
function onMouse( e:MouseEvent ) {
t.text = e.stageX +", "+ e.stageY;
}
对我来说,当鼠标位于Flash区域内部时,以及当您在Flash中单击并向外拖动时,事件都会显示在文本字段中。因此,如果您遇到问题,我的猜测是它可能与您正在使用的组件或您的内容的结构有关(例如,您正在注册事件的对象等)。但是当用户拖出Flash矩形时,没有任何特殊方法可以让鼠标事件继续运行。
(请注意,触摸设备可能是一种不同的情况 - 除了在全屏模式下,他们的浏览器通常会在进入Flash之前吃平移手势,或者有时当Flash“放大”时他们会提供Flash拖动事件(通过双击) 。不同设备上不同浏览器的里程可能会有所不同。)
答案 1 :(得分:0)
您无法获得任何对您有意义的信息。我理解你要完成的是什么,是的,你是对的,滚动条对他们有一些黑魔法,如果你开始拖动,即使鼠标超出了玩家的范围,它也会继续滚动
我在试图听取事件时进行了一些测试并空手而归。玩家本身必须得到它们,但无论如何我都不会暴露它们。
所以,我考虑创建一个或多或少隐藏的滚动组件(或它们的集合),捕获点击并启动拖动事件。有点黑客,但很酷的想法...
然后你可以轮询当前滚动位置,用一组水平和垂直滚动条猜测鼠标在窗口外面(窗口外)。但是,您可以执行此操作,问题是卷轴位置值将根据其原始大小具有最大限制。这意味着您将在鼠标所在的位置留下空白。因此,您可以知道Y轴鼠标位于屏幕上的远处或下方,即使它位于应用程序的左侧或右侧(X轴)之外(例如我在第二台显示器上),但是您将不知道它在X轴上的位置,你只知道Y与应用程序大小有关(不高于或低于屏幕上其他地方的位置)。
以下是使用此技巧/黑客可以捕获的内容的图像:
所以是的,你可以像我描述的那样进行轮询类型的方法,但是,你只能得到那些坐标。
最终,它不是很有帮助,因为你需要扩展滚动矩形(或应用程序)的边界以完全捕获鼠标所在的位置 - 因此你可以将它扩展到屏幕的完整大小,并且可能只是使用正常事件。负面边界(左边或上面的app)尤其如此。
我没有尝试过创建一个位于主应用程序窗口外的大容器,并为其应用滚动条。如果你这样做,你可能会使它工作:
这是一个有趣的概念,聪明 - 绝对不支持功能。 :P〜
答案 2 :(得分:0)
以下是我用于此目的的一些代码:
import flash.display.InteractiveObject;
import flash.events.MouseEvent;
import flash.geom.Point;
public class Dragger
{
private var target:InteractiveObject;
private var mouseDownPoint:Point;
private var originalPosition:Point;
public function Dragger(target:InteractiveObject)
{
this.target = target;
target.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}
private function onMouseDown(event:MouseEvent):void
{
mouseDownPoint = new Point(event.stageX, event.stageY);
originalPosition = new Point(target.x, target.y);
event.stopPropagation();
target.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
target.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseUp(event:MouseEvent):void
{
onMouseMove(event);
mouseDownPoint = null;
event.stopPropagation();
target.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
target.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseMove(event:MouseEvent):void
{
if (!mouseDownPoint) return;
target.x = originalPosition.x + event.stageX - mouseDownPoint.x;
target.y = originalPosition.y + event.stageY - mouseDownPoint.y;
event.updateAfterEvent();
event.stopPropagation();
}
}
要使用,只需执行新的Dragger(your_object)。