觸控事件處理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;
}
|
|