手勢事件處理Flash Player 10.1 以及更新的版本,Adobe AIR 2 以及更新的版本 使用與基本觸控事件相同的方式,處理手勢事件。您可以偵聽 TransformGestureEvent 類別、GestureEvent 類別和 PressAndTapGestureEvent 類別中事件類型常數所定義的一連串手勢事件。 若要處理手勢觸控事件:
例如,下列程式碼會在揮動觸控螢幕內 mySprite 中繪製的正方形時顯示訊息: Multitouch.inputMode=MultitouchInputMode.GESTURE;
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(TransformGestureEvent.GESTURE_SWIPE, swipehandler);
function swipehandler(evt:TransformGestureEvent): void {
myTextField.text = "I've been swiped";
myTextField.y = 50;
addChild(myTextField);
}
兩根手指點選事件的處理方式相同,但是使用 GestureEvent 類別: Multitouch.inputMode=MultitouchInputMode.GESTURE;
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(GestureEvent. GESTURE_TWO_FINGER_TAP, taphandler);
function taphandler(evt:GestureEvent): void {
myTextField.text = "I've been two-finger tapped";
myTextField.y = 50;
addChild(myTextField);
}
按下並輕點事件的處理方式也相同,但是使用 PressAndTapGestureEvent 類別: Multitouch.inputMode=MultitouchInputMode.GESTURE;
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(PressAndTapGestureEvent. GESTURE_PRESS_AND_TAP, taphandler);
function taphandler(evt:PressAndTapGestureEvent): void {
myTextField.text = "I've been press-and-tapped";
myTextField.y = 50;
addChild(myTextField);
}
備註: 在所有執行階段環境中,並非支援所有 GestureEvent、TransformGestureEvent 和 PressAndTapGestureEvent 事件類型。例如,並非所有觸控裝置都可以偵測多根手指揮動。因此,無法偵測多根手指揮動的裝置就不支援 InteractiveObject gestureSwipe 事件。嘗試測試特定事件支援,以確保應用程式可以運作,並參閱疑難排解,以取得詳細資訊。
手勢事件屬性手勢事件的事件屬性範圍小於基本觸控事件。而其存取方式一樣是透過事件處理常式函數中的事件物件。 例如,使用者在 mySprite 上執行旋轉手勢時,下列程式碼會將它旋轉。這個文字欄位會顯示最後一個手勢之後的旋轉量 (測試這個程式碼時,將它旋轉數次以查看值變更): Multitouch.inputMode=MultitouchInputMode.GESTURE;
var mySprite:Sprite = new Sprite();
var mySpriteCon:Sprite = new Sprite();
var myTextField:TextField = new TextField();
myTextField.y = 50;
addChild(myTextField);
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(-20,-20,40,40);
mySpriteCon.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
addChild(mySpriteCon);
mySprite.addEventListener(TransformGestureEvent.GESTURE_ROTATE, rothandler);
function rothandler(evt:TransformGestureEvent): void {
evt.target.parent.rotationZ += evt.target.rotation;
myTextField.text = evt.target.parent.rotation.toString();
}
備註: 在所有執行階段環境中,並非支援所有 TransformGestureEvent 屬性。例如,並非所有觸控裝置都可以偵測螢幕上的手勢旋轉。因此,無法偵測手勢旋轉的裝置就不支援 TransformGestureEvent.rotation 屬性。嘗試測試特定屬性支援,以確保應用程式可以運作,並參閱疑難排解,以取得詳細資訊。
手勢階段此外,還可以透過階段來追蹤手勢事件,因此您可以在執行手勢時追蹤屬性。例如,您可以追蹤在使用揮動手勢移動物件時的 x 座標。使用這些值,可以在揮動完成之後,透過路徑中的所有點來繪製線條。或是,在螢幕中使用平移手勢拖曳顯示物件時,以視覺方式變更該顯示物件。請在平移手勢完成之後再次變更物件。
Multitouch.inputMode = MultitouchInputMode.GESTURE;
var mySprite = new Sprite();
mySprite.addEventListener(TransformGestureEvent.GESTURE_PAN , onPan);
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0, 0, 40, 40);
var myTextField = new TextField();
myTextField.y = 200;
addChild(mySprite);
addChild(myTextField);
function onPan(evt:TransformGestureEvent):void {
evt.target.localX++;
if (evt.phase==GesturePhase.BEGIN) {
myTextField.text = "Begin";
evt.target.scaleX *= 1.5;
evt.target.scaleY *= 1.5;
}
if (evt.phase==GesturePhase.UPDATE) {
myTextField.text = "Update";
evt.target.alpha = 0.5;
}
if (evt.phase==GesturePhase.END) {
myTextField.text = "End";
evt.target.width = 40;
evt.target.height = 40;
evt.target.alpha = 1;
}
}
備註: 更新階段的頻率取決於執行階段的環境。部分的作業系統和硬體組合則根本不會轉送更新。
簡單手勢事件的手勢階段是「all」部分的手勢事件物件不會追蹤手勢事件的個別階段,而是改為以 all 值填入事件物件的 phase 屬性。簡單手勢會揮動,而兩根手指點選則不會透過多個階段來追蹤事件。針對偵聽 gestureSwipe 或 gestureTwoFingerTap 事件,其 InteractiveObject 事件物件的 phase 屬性在傳送事件之後一律會是 all: Multitouch.inputMode = MultitouchInputMode.GESTURE;
var mySprite = new Sprite();
mySprite.addEventListener(TransformGestureEvent.GESTURE_SWIPE, onSwipe);
mySprite.addEventListener(GestureEvent.GESTURE_TWO_FINGER_TAP, onTwoTap);
mySprite.graphics.beginFill(0x336699);
mySprite.graphics.drawRect(0, 0, 40, 40);
var myTextField = new TextField();
myTextField.y = 200;
addChild(mySprite);
addChild(myTextField);
function onSwipe(swipeEvt:TransformGestureEvent):void {
myTextField.text = swipeEvt.phase // Output is "all"
}
function onTwoTap(tapEvt:GestureEvent):void {
myTextField.text = tapEvt.phase // Output is "all"
}
|
|