簡體   English   中英

有誰知道如何在 Flex/Flash Air 應用程序中捕獲鼠標?

[英]Does anyone know how to capture the mouse in Flex/Flash Air application?

有人知道如何在空中應用程序中捕獲鼠標。 我知道這是可能的,因為 flex 滾動條會捕獲鼠標。 我想復制滾動條的鼠標捕獲。

在 flex/air 應用程序 window 中試試這個:

<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>

如果按住滾動條手柄並向外拖動,即使在 window 之外,滾動條仍然有效。 它不會失去焦點。 所以它正在捕獲鼠標。

我想要的是:

  • 鼠標和觸摸捕獲。 (即使在 window 之外,仍然按下按鈕或觸摸點)

這是我用於此目的的一些代碼:

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();
    } 
}

要使用,只需執行 new Dragger(your_object)。

至少在使用鼠標的桌面上,據我所知,這應該可以正常工作。 例如:

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 內單擊並拖動到外部時,事件都會顯示在文本字段中。 因此,如果您遇到問題,我的猜測是它可能與您正在使用的組件或您的內容的結構方式有關(例如,您正在注冊的事件是什么 object 等)。 但是當用戶拖出 Flash 矩形時,沒有任何特殊的方法可以讓鼠標事件繼續。

(請注意,觸摸設備可能是一種不同的情況 - 通常他們的瀏覽器在到達 Flash 之前會吃平移手勢,除非在全屏模式下,或者有時當 ZBF2C44E6FC09515648B.91B1BB4EC3F5FZ 出現時,他們會給出 Flash 拖動事件(“你的雙倍里程竊聽”)可能因不同設備上的不同瀏覽器而異..)

您無法獲得任何對您有意義的信息。 我了解您要完成的工作,是的,您是對的,滾動條對它們有一些魔力,因為如果您開始拖動,即使鼠標超出播放器范圍,它也會繼續滾動.

我對嘗試監聽事件進行了一些測試,結果空手而歸。 玩家自己必須得到它們,但它們不會以我能找到的方式暴露出來。

所以,我考慮創建一個或多或少隱藏的滾動組件(或一組)來捕獲點擊並啟動拖動事件。 有點黑客,但很酷的想法......

然后,您可以輪詢當前滾動 position 以使用一組水平和垂直滾動來猜測鼠標的位置(窗口外)。 您可以這樣做,但是,問題在於滾動條 position 值將根據其原始大小具有最大限制。 這意味着您將在鼠標所在的位置留有空隙。 因此,您可以知道 Y 軸鼠標在屏幕上的位置向上或向下多遠,即使它位於應用程序的左側或右側(X 軸)之外(例如,我在第二台顯示器上),但您會不知道它在 X 軸上的位置,並且您只會知道與應用程序大小相關的 Y(不高於或低於它在屏幕上其他位置的位置)。

這是您可以使用此技巧/技巧捕獲的圖像:在此處輸入圖像描述

所以是的,你可以像我描述的那樣做一個輪詢類型的方法,但是,你只會得到那些坐標。

最終,它不是很有幫助,因為您需要擴展滾動矩形(或應用程序)的邊界以完全捕獲鼠標所在的位置 - 因此您可以將其擴展為屏幕的完整尺寸,並且可以只使用普通事件. 對於負邊界(左側或上方的應用程序)尤其如此。

我沒有嘗試過的是創建一個位於主應用程序 window 之外的大型容器並對其應用滾動條。 如果您這樣做,您可能會使其工作:

在此處輸入圖像描述

這是一個有趣的概念,聰明 - 絕對不支持的功能。 :P~

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM