터치 이벤트 처리

Flash Player 10.1 이상, Adobe AIR 2 이상

기본적인 터치 이벤트는 ActionScript에서 마우스 이벤트를 비롯한 기타 이벤트를 처리하는 것과 마찬가지 방법으로 처리됩니다. TouchEvent 클래스의 이벤트 유형 상수에서 정의된 일련의 터치 이벤트를 수신할 수 있습니다.
참고: 다중 터치 지점 입력(예: 둘 이상의 손가락으로 장치 터치)의 경우 첫 번째 접점이 마우스 이벤트와 터치 이벤트를 전달합니다.
기본적인 터치 이벤트 처리:
  1. flash.ui.Multitouch.inputMode 속성을 MultitouchInputMode.TOUCH_POINT로 설정하여 응용 프로그램에서 터치 이벤트를 처리하도록 설정합니다.

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

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

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

예를 들어 다음 코드는 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, touchMovetouchEnd 이벤트를 처리하기 위한 값을 제공합니다.

예를 들어 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에 추가되지만 터치 이벤트를 움직이고 종료하기 위한 리스너는 추가되지 않습니다. 사용자의 손가락 또는 포인팅 장치가 표시 객체 위에서 움직이는 경우 스테이지에서 터치 이벤트를 계속해서 수신합니다.

터치 지점 ID

TouchEvent.touchPointID 속성은 터치 입력에 응답하는 응용 프로그램을 작성하는 데 필수적인 요소입니다. Flash 런타임은 각 터치 지점에 고유한 touchPointID 값을 할당합니다. 응용 프로그램에서 터치 입력 단계 또는 움직임에 응답할 때마다 touchPointID를 확인한 후 이벤트를 처리합니다. Sprite 클래스의 터치 입력 드래그 메서드는 touchPointID 속성을 매개 변수로 사용하여 올바른 입력 인스턴스가 처리되도록 합니다. touchPointID 속성은 이벤트 핸들러가 올바른 터치 지점에 응답하도록 보장합니다. 이 속성을 사용하지 않을 경우 이벤트 핸들러는 장치에서 터치 이벤트 유형의 모든 인스턴스(모든 touchMove 이벤트 포함)에 응답하므로 예측 불가능한 비헤이비어가 나타납니다. 이 속성은 사용자가 객체를 드래그하는 경우 특히 중요합니다.

touchPointID 속성으로 전체 터치 시퀀스를 관리할 수 있습니다. 터치 시퀀스는 1개의 touchBegin 이벤트, 0개 이상의 touchMove 이벤트, 1개의 touchEnd 이벤트를 포함하며 모두 동일한 touchPointID 값을 갖습니다.

다음 예제에서는 터치 움직임 이벤트에 응답하기 전에 변수 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; 
}