2011-07-07 28 views
0

有人知道如何在空中應用中捕捉鼠標。我知道它的可能性,因爲flex滾動條捕捉鼠標。我想複製滾動條的鼠標捕捉。有誰知道如何在Flex/Flash Air應用程序中捕捉鼠標?

試試這個在Flex/AIR應用程序窗口:如果按

<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

您是否嘗試過實施這種天真的方式?回想起來,它會自動運行 - 只要拖動操作正在進行中,即使在舞臺外,您也可以繼續獲取MouseMove事件。它可能也取決於註冊,比如說MouseDown或DragStart,但不應該有任何魔力。 – fenomas

+0

我實際上並沒有試圖拖動一個對象,我想實現平移。像任何觸摸設備,當你想向下滾動。你知道我可以使用的東西嗎?我嘗試了startDrag,但它使用了整個容器Im。它有點捕捉鼠標,如果鼠標在窗口之外,則不會觸發事件,但當鼠標返回到窗口時繼續拖動。 – Vicro

+0

我無法將此視覺化。這是在瀏覽器中,對嗎?你在觸摸設備上嗎? (通常在設備上,瀏覽器在進入Flash之前就會進行拖拽事件,除非在某些情況下(例如全屏模式)。) 無論如何,我會用一些測試代碼編寫正確的答案,因爲我相信這應該可以正常工作(這意味着您的問題可能會在其他地方)。 – fenomas

回答

0

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

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「放大」時它們會給Flash拖動事件(通過雙擊)。您的里程可能因不同設備上的不同瀏覽器而異..)

+0

這實際上是一個帶觸摸屏的平板電腦(平板電腦或觸摸屏)。你的例子是否在空氣應用程序中工作?例如,你開始一個拖放操作,並在按住鼠標的同時將鼠標移動到窗口之外? – Vicro

+0

它在PC上的AIR應用程序中正常工作。我不知道slates,因爲我從來沒有用過,但除非操作系統像我描述的那樣吃事件,否則它應該以同樣的方式工作。順便提一下,默認情況下,觸摸事件會被轉換爲鼠標事件,所以您應該也可以免費使用它們。 (即使應用程序在觸摸設備上運行,您也必須先切換一些開關。) – fenomas

+0

我做了一些測試,如果將偵聽器添加到舞臺並單擊並拖動到窗口外面,它會起作用。活動將走到舞臺。所以如果我點擊舞臺並按住按鈕,舞臺就會捕捉鼠標。它不會爲一個按鈕工作。如果我點擊並拖動按鈕外面,它不會捕獲鼠標,所以不會有事件發生。 – Vicro

0

您無法獲得任何對您有意義的信息。我明白你要完成的是什麼,是的,你說得對,滾動條對他們來說有一些黑魔法,因爲如果你開始拖動它,即使鼠標超出了播放器的範圍,它也將繼續滾動。

我跑了一些試圖聆聽事件並空手而來的測試。玩家本身必須得到他們,但他們不會暴露在我能找到的地方。

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

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

這裏是你可以用這一招捕捉什麼圖像/黑客: enter image description here

所以,是的,你可以像我描述的方法做的輪詢類型,但是,你只會得到這些座標。

最終,它不是非常有用,因爲您需要擴展滾動矩形(或應用程序)的邊界以完全捕獲鼠標所在的位置 - 因此您可以將其擴展爲全屏大小,並且可以只是使用正常的事件。對於負面的邊界(左邊或上面的應用)尤其如此。

我沒有嘗試過的是創建一個大容器放置在主應用程序窗口外並將滾動條應用到它。如果你這樣做,你可能會使其工作:

enter image description here

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

+0

我也想過在內容的頂部放置一個隱藏的滾動條來處理滾動,但是我也希望能夠在點擊或點擊時(不拖動)點擊區域內的對象進行點擊(不拖動) – Vicro

+0

我向你保證柔性滾動條中沒有黑魔法,它們使用與您相同的事件。該框架是開源的,你可以檢查你是否喜歡。 – fenomas

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

要使用,只需做新的牽引機(your_object)。