觸控事件處理Flash Player 10.1 以及更新的版本,Adobe AIR 2 以及更新的版本 基本觸控事件的處理方式,與 ActionScript 處理其他事件的方式相同 (例如滑鼠事件)。您可以偵聽 TouchEvent 類別中之事件類型常數所定義的一連串觸控事件。
備註: 針對多個觸控點輸入 (例如使用多根手指觸控裝置),第一個接觸點會傳送滑鼠事件和觸控事件。
處理基本觸控事件:
例如,下列程式碼會在觸控螢幕內 mySprite 中繪製的正方形被點選時顯示訊息: Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; var mySprite:Sprite = new Sprite(); var myTextField:TextField = new TextField(); mySprite.graphics.beginFill(0x336699); mySprite.graphics.drawRect(0,0,40,40); addChild(mySprite); mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); function taphandler(evt:TouchEvent): void { myTextField.text = "I've been tapped"; myTextField.y = 50; addChild(myTextField); } 觸控事件屬性發生事件時,會建立事件物件。TouchEvent 物件包含的資訊,是有關觸控事件的位置和條件。您可以使用事件物件的屬性來擷取該資訊。 例如,下列程式碼會建立 TouchEvent 物件 evt,然後在文字欄位中顯示事件物件的 stageX 屬性 (「舞台」空間中觸控發生點的 x 座標): Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; var mySprite:Sprite = new Sprite(); var myTextField:TextField = new TextField(); mySprite.graphics.beginFill(0x336699); mySprite.graphics.drawRect(0,0,40,40); addChild(mySprite); mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); function taphandler(evt:TouchEvent): void { myTextField.text = evt.stageX.toString; myTextField.y = 50; addChild(myTextField); } 請參閱 TouchEvent 類別,取得事件物件可用屬性的詳細資訊。
備註: 在所有執行階段環境中,並非支援所有 TouchEvent 屬性。例如,並非所有觸控裝置都可以偵測使用者施予觸控螢幕的壓力。因此,無法偵測壓力的裝置就不支援 TouchEvent.pressure 屬性。嘗試測試特定屬性支援,以確保應用程式可以運作,並參閱疑難排解,以取得詳細資訊。
觸控事件階段在 InteractiveObject 上和外部,透過各種舞台來追蹤觸控事件,就像處理滑鼠事件一樣。而且,透過觸控互動的開始、中間和結束,來追蹤觸控事件。TouchEvent 類別提供的值可用來處理 touchBegin、touchMove 和 touchEnd 事件。 例如,您可以使用 touchBegin、touchMove 和 touchEnd 事件,在使用者觸碰和移動顯示物件時提供視覺回應: Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; var mySprite:Sprite = new Sprite(); mySprite.graphics.beginFill(0x336699); mySprite.graphics.drawRect(0,0,40,40); addChild(mySprite); var myTextField:TextField = new TextField(); myTextField.width = 200; myTextField.height = 20; addChild(myTextField); mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); function onTouchBegin(event:TouchEvent) { myTextField.text = "touch begin" + event.touchPointID; } function onTouchMove(event:TouchEvent) { myTextField.text = "touch move" + event.touchPointID; } function onTouchEnd(event:TouchEvent) { myTextField.text = "touch end" + event.touchPointID; } 備註: 初始觸控偵聽程式會連接至 mySprite,但是移動和結束觸控事件的偵聽程式則否。如果使用者的手指或指標裝置移動到顯示物件的前面,則「舞台」還是會繼續偵聽觸控事件。
觸控點 IDTouchEvent.touchPointID 屬性是撰寫回應觸控輸入之應用程式的必要部分。Flash 執行階段會將唯一的 touchPointID 值指定給每個觸控點。只要應用程式回應觸控輸入的階段或移動,就會先檢查 touchPointID,再處理事件。Sprite 類別的觸控輸入拖曳方法,使用 touchPointID 屬性做為參數,來處理正確的輸入實體。touchPointID 屬性可確保事件處理常式回應正確的觸控點。否則,事件處理常式會回應裝置上觸控事件類型的所有實體 (例如所有 touchMove 事件),進而產生無法預測的行為。在使用者拖曳物件時,這個屬性特別重要。 touchPointID 屬性可用來管理整個觸控序列。觸控序列具有一個 touchBegin 事件、零個或以上的 touchMove 事件,以及一個具有相同 touchPointID 值的 touchEnd 事件。 下列範例會先建立 touchMoveID 變數以測試正確的 touchPointID 值,再回應觸控移動事件。否則,其他觸控輸入也會觸發事件處理常式。請注意,適用於移動和結束階段的偵聽程式位於舞台上,而不是顯示物件。如果使用者的觸控移動超出顯示物件的界限,則舞台會偵聽移動或結束階段。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; var mySprite:Sprite = new Sprite(); mySprite.graphics.beginFill(0x336699); mySprite.graphics.drawRect(0,0,40,40); addChild(mySprite); var myTextField:TextField = new TextField(); addChild(myTextField); myTextField.width = 200; myTextField.height = 20; var touchMoveID:int = 0; mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); function onTouchBegin(event:TouchEvent) { if(touchMoveID != 0) { myTextField.text = "already moving. ignoring new touch"; return; } touchMoveID = event.touchPointID; myTextField.text = "touch begin" + event.touchPointID; stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); } function onTouchMove(event:TouchEvent) { if(event.touchPointID != touchMoveID) { myTextField.text = "ignoring unrelated touch"; return; } mySprite.x = event.stageX; mySprite.y = event.stageY; myTextField.text = "touch move" + event.touchPointID; } function onTouchEnd(event:TouchEvent) { if(event.touchPointID != touchMoveID) { myTextField.text = "ignoring unrelated touch end"; return; } touchMoveID = 0; stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); myTextField.text = "touch end" + event.touchPointID; } |
|