Obsługa zdarzeń dotyku

Flash Player 10.1 i nowsze wersje, Adobe AIR 2 i nowsze wersje

Podstawowe zdarzenia dotyku są obsługiwane w języku ActionScript tak samo, jak pozostałe zdarzenia, np. zdarzenia myszy. Aplikacja może wykrywać szereg zdarzeń dotyku zdefiniowanych jako stałe typów zdarzeń w klasie TouchEvent .
Uwaga: W przypadku interakcji obejmujących wiele dotknąć (np. dotknięcie urządzenia więcej niż jednym palcem) dotknięcie pierwszego punktu kontaktu powoduje wywołanie zdarzenia myszy i zdarzenia dotknięcia.
Aby obsłużyć podstawowe zdarzenia dotyku:
  1. Skonfiguruj aplikację do obsługi zdarzeń dotyku, przypisując właściwości flash.ui.Multitouch.inputMode wartość MultitouchInputMode.TOUCH_POINT .

  2. Dołącz detektor zdarzeń do wystąpienia klasy, która dziedziczy właściwości z klasy InteractiveObject, takiej jak Sprite lub TextField.

  3. Określ typ zdarzenia dotykowego, które ma być obsługiwane.

  4. Wywołaj funkcję obsługi zdarzeń, która wykona oczekiwaną czynność w odpowiedzi na zdarzenie.

Poniższy przykład prezentuje wyświetlanie komunikatu w przypadku stuknięcia kwadratu narysowanego na obiekcie mySprite na ekranie dotykowym:

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); 
}

Właściwości zdarzeń dotyku

Z chwilą wystąpienia zdarzenia tworzony jest obiekt zdarzenia. Obiekt TouchEvent zawiera informacje o położeniu i innych okolicznościach zdarzenia dotyku. Informacje te można odczytać, korzystając z właściwości obiektu zdarzenia.

Poniższy przykładowy kod tworzy obiekt TouchEvent o nazwie evt , a następnie w polu tekstowym wyświetla właściwość stageX obiektu zdarzenia (współrzędną x dotkniętego punktu w przestrzeni stołu montażowego):

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); 
}
Listę właściwości dostępnych w obiekcie zdarzenia zawiera opis klasy TouchEvent .
Uwaga: Nie wszystkie właściwości klasy TouchEvent są obsługiwane we wszystkich środowiskach wykonawczych. Na przykład nie wszystkie urządzenia dotykowe mierzą nacisk wywierany przez użytkownika na ekran dotykowy. Na takich urządzeniach właściwość TouchEvent.pressure nie jest obsługiwana. Aby mieć pewność, że aplikacja będzie działała prawidłowo, należy sprawdzić, czy odpowiednie właściwości są obsługiwane. Więcej informacji można znaleźć w sekcji Rozwiązywanie problemów .

Fazy zdarzenia dotyku

Podobnie jak w przypadku zdarzeń myszy, zdarzenia dotyku przechodzą przez kolejne fazy nad obiektem InteractiveObject i na zewnątrz tego obiektu. Zdarzenia dotyku wywoływane są na początku, w trakcie i na końcu interakcji dotykowej. Klasa TouchEvent udostępnia wartości umożliwiające obsługę zdarzeń touchBegin , touchMove i touchEnd .

Można na przykład wykorzystać zdarzenia touchBegin , touchMove i touchEnd do przekazywania użytkownikowi wizualnej informacji zwrotnej w miarę, jak dotyka on ekranu i przemieszcza obiekt wyświetlany:

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; 
}
Uwaga: Detektor początkowego dotknięcia jest przyłączony do obiektu mySprite, ale detektory ruchu i zakończenia zdarzenia dotyku nie są przyłączone do obiektu. Jeśli palec lub urządzenie wskazujące przemieści się nad obiekt wyświetlany, obiekt Stage będzie dalej wykrywał zdarzenie dotyku.

Identyfikator punktu kontaktu

Właściwość TouchEvent.touchPointID ma zasadnicze znaczenie przy pisaniu aplikacji reagujących na interakcje dotykowe. Środowisko wykonawcze Flash przypisuje każdemu punktowi kontaktu unikatową wartość touchPointID . Zawsze, gdy aplikacja reaguje na fazy lub ruch w ramach interakcji dotykowej, należy przed obsłużeniem zdarzenia odczytać wartość touchPointID . W metodach przeciągania udostępnianych przez klasę Sprite właściwość touchPointID jest używana jako parametr umożliwiający obsługę właściwej instancji interakcji. Właściwość touchPointID umożliwia reagowanie na właściwy punkt kontaktu. Brak lub zignorowanie tej właściwości doprowadziłoby do sytuacji, w której funkcja obsługi zdarzenia reagowałaby na każdą instancję zdarzenia dotykowego danego typu (np. na wszystkie zdarzenia touchMove ), co prowadziłoby do nieprzewidywalnego zachowania aplikacji. Ta właściwość jest szczególnie ważna, gdy użytkownik przeciąga obiekty.

Właściwość touchPointID umożliwia prawidłowe obsłużenie całej sekwencji dotykowej. Sekwencja dotykowa składa się z jednego zdarzenia touchBegin , zera lub większej liczby zdarzeń touchMove oraz jednego zdarzenia touchEnd — przy czym wszystkie te zdarzenia mają tę samą wartość touchPointID .

W poniższym przykładzie tworzona jest zmienna touchMoveID służąca do sprawdzania, czy wartość touchPointID jest prawidłowa, przed podjęciem reakcji na przemieszczanie punktu dotyku. Jeśli wartość jest nieprawidłowa, inne dotknięcia także wywołają funkcję obsługi zdarzenia. Należy zwrócić uwagę, że detektory faz przemieszczania i zakończenia, są metodami stołu montażowego, a nie obiektu wyświetlanego. Stół montażowy wykrywa fazy ruchu i zakończenia na wypadek, gdyby użytkownik przesunął punkt kontaktu poza granice obiektu wyświetlanego.
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; 
}