有谁知道如何在Flex / Flash Air应用程序中捕获鼠标?

时间:2011-07-07 06:14:58

标签: flex actionscript-3 air

有人知道如何在空中应用程序中捕获鼠标。我知道它可能,因为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>

如果按住滚动条手柄并向外拖动,即使在窗口外,滚动条仍可正常工作。它不会失去焦点。所以它正在捕捉鼠标。

我想要的是什么:

  • 鼠标和触控捕捉。 (甚至在按下按钮或触摸点的同时在窗外)

3 个答案:

答案 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与应用程序大小有关(不高于或低于屏幕上其他地方的位置)。

以下是使用此技巧/黑客可以捕获的内容的图像: enter image description here

所以是的,你可以像我描述的那样进行轮询类型的方法,但是,你只能得到那些坐标。

最终,它不是很有帮助,因为你需要扩展滚动矩形(或应用程序)的边界以完全捕获鼠标所在的位置 - 因此你可以将它扩展到屏幕的完整大小,并且可能只是使用正常事件。负面边界(左边或上面的app)尤其如此。

我没有尝试过创建一个位于主应用程序窗口外的大容器,并为其应用滚动条。如果你这样做,你可能会使它工作:

enter image description here

这是一个有趣的概念,聪明 - 绝对不支持功能。 :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)。