Розробка програм для Windows Phone/XNA - Робота із сенсорним екраном

Матеріал з Вікіпідручника

Телефон Windows Phone 7 оснащено «мульті-тач» сенсорним дисплеєм, це означає, що апарат може сприймати до 4 одночасних доторкань пальців. Програмувати реакцію на дії користувача можна на так званих низькому рівні, коли програма отримує безпосередню інформацію про сигнали дисплею, і на високому рівні - коли програма може реєструвати деякий набір відомих жестів.

Реагування на дотики

В програмах XNA, сенсорні дані доступні через статичний клас TouchPanel, який дозволяє аналізувати теперішній стан панелі під час виконання методу Update. Основна задача методу Update аналізуючи дотики користувача управляти тим що відбувається на екрані за допомогою методу Draw. Ви можете оримати інформацію про власне про сам пристрій мульті-тач визвавши статичний метод TouchPanel.GetCapabilities:

  • IsConnected повертає якщо панель доступна і працює.
  • MaximumTouchCount повертає кількість точок дотику .

Найчастіше ви будете отримувати конкретну інформацію про точки дотику і жести, і в методі Update напишете наступну строчку коду:

TouchCollection touchLocations = TouchPanel.GetState();


Колекція TouchCollection може бути пустою або містити декілька об’єктів типу TouchLocation, який має такі три властивості:

  • State — набір значень TouchLocationState таких як: Pressed (натиснено), Moved (рух по екрану), Released (відпущено).
  • Position — це двомірний вектор типу Vector2 який вказує позицію пальця відносно верхнього-лівого кута екрану.
  • Id — ідентифікатор типу integer який ідентифікує конкретний палец, якому видається номер від початку події Pressed до події Released.

Класс TouchLocation містить ще один корисний метод, який потрібен для аналізу рухів пальцем по екрану – TryGetPreviousLocation, і використовується як приведено нижче:

TouchLocation previousTouchLocation; 
bool success = touchLocation.TryGetPreviousLocation(out previousTouchLocation);


Якщо ви спробуєте попросити попередній стан у події, в якої touchLocation.State = Pressed, тоді метод TryGetPreviousLocation поверне значення false, а значення властивості previousTouchLocation.State буде мати значення TouchLocationState.Invalid. Ви отримаєте такий самий результат, якщо спробуєте визвати метод для об’єкту TouchLocation який ви перед тим отримали як результат методу TryGetPreviousLocation.

Розпізнавання жестів TouchPanel також реалізує можливість розпізнавання жестів.

TouchPanel.EnabledGestures = GestureType.Tap;


GestureType це перечислення з такими елементами : Tap, DoubleTap, Flick, Hold, Pinch, PinchComplete, FreeDrag, HorizontalDrag, VerticalDrag, і DragComplete, які задані у вигляді бітових масок, отже ви можете комбінувати їх при потребі за допомогою операції побітового А (тобто |).

Фактичне їх значення таке:

Назва жесту Опис
Tap Палець натискає на екран, тобто опускається і підіймається швидко без рухів.
DoubleTap Два послідовних натискання
Hold Палець торкається екрану і залишається на місці деякий час
FreeDrag Палець торкається екрану і рухається в будь-якому напрямку
VerticalDrag Палець торкається екрану і рухається вверх або вниз
HorizontalDrag Палець торкається екрану і рухається вліво/вправо.
DragComplete Означає кінець жестів FreeDrag, VerticalDrag, або HorizontalDrag
Flick Палець рухається по екрану і підіймається без зупинки
Pinch Два пальця натискають екран і пересуваються
PinchComplete Закінчення попереднього жесту Pinch

Код який дозволяє отримати інформацію про те який жест було зареєстровано системою буде виглядати так:

while (TouchPanel.IsGestureAvailable) 
{ 
    GestureSample gestureSample = TouchPanel.ReadGesture(); 
    if (gestureSample.GestureType == GestureType.Tap) {
        Vector2 touchPosition = gestureSample.Position; 
        int X = textPosition.X;
        int Y = touchPosition.Y;
    } 
}


Посилання[ред.]

Література[ред.]