동작 이벤트 처리

Flash Player 10.1 이상, Adobe AIR 2 이상

동작 이벤트는 기본 터치 이벤트와 같은 방식으로 처리합니다. TransformGestureEvent 클래스, GestureEvent 클래스 및 PressAndTapGestureEvent 클래스의 이벤트 유형 상수에 정의된 일련의 동작 이벤트를 수신할 수 있습니다.

동작 터치 이벤트 처리:
  1. flash.ui.Multitouch.inputMode 속성을 MultitouchInputMode.GESTURE로 설정하여 응용 프로그램이 동작 입력을 처리하도록 설정합니다.

  2. Sprite 또는 TextField와 같은 InteractiveObject 클래스에서 속성을 상속하는 클래스의 인스턴스에 이벤트 리스너를 추가합니다.

  3. 처리할 동작 이벤트 유형을 지정합니다.

  4. 이벤트에 응답하여 특정 작업을 수행할 이벤트 핸들러 함수를 호출합니다.

예를 들어 다음 코드는 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 값으로 채웁니다. 스와이프 및 두 손가락 두드리기와 같은 단순한 동작은 이벤트를 여러 단계로 추적하지 않습니다. 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" 
}