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:
-
Skonfiguruj aplikację do obsługi zdarzeń dotyku, przypisując właściwości
flash.ui.Multitouch.inputMode
wartość
MultitouchInputMode.TOUCH_POINT
.
-
Dołącz detektor zdarzeń do wystąpienia klasy, która dziedziczy właściwości z klasy InteractiveObject, takiej jak Sprite lub TextField.
-
Określ typ zdarzenia dotykowego, które ma być obsługiwane.
-
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;
}
|
|
|