Розробка програм для 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;
}
}
Посилання
[ред.]Література
[ред.]- Programming Windows Phone 7, Charles Petzold