День тридцатый. Жесты

Вступление

С появлением сенсорных экранов появилась возможность взаимодействовать с программой не только с помощью мыши и клавиатуры, но и с помощью жестов. То же самое относится к устройствам Windows Phone 7. Сегодня сфокусируемся на использовании жестов, используя сборку XNA в Silverlight-приложении.

Что такое XNA?

Подключение сборки XNA к проекту

Для начала нужно добавить ссылку на сборку Microsoft.Xna.Framework.Input.Touch (Щелкните правой кнопкой мыши на имени проекта и выберите эту сборку из списка).

Доступ к TouchPanel

TouchPanel в XNA отвечает за всю поверхность экрана. Получив доступ к TouchPanel, мы сможем использвать библиотеку жестов (Gesture library) и даже управлять нужными жестами в своих интересах.

Добавьте в начале проекта строчку


using Microsoft.Xna.Framework.Input.Touch;

Теперь мы можем сделать доступными нужные жесты (остальные будут игнорироваться):


TouchPanel.EnabledGestures = GestureType.Hold | GestureType.Tap | GestureType.DoubleTap | GestureType.Flick | GestureType.Pinch;

Подключаться к жестам можно в любом месте, но удобнее это сделать при загрузке приложения. Далее используются стандартные приемы программирования XNA. В XNA-приложениях имеется стандартный игровой цикл, который повторяется 30 раз в секунду. Также имеются два основных метода Draw() и Update(), которые постоянно сменяют друг друга. Один метод отвечает за прорисовку, второй - за обновление изменившихся данных на экране.

В Silverlight данный подход не работает, так как используется событийная модель.

Распознавание жестов при помощи событий

Имея доступ к TouchPanel, можно распознавать жесты. Для этого нужно подключить событие ManipulationCompleted к любому элементу. Для нашего примера удобнее использовать элемент LayoutRoot. В этом случае не имеет значения, где именно был сделан жест. Он все равно будет обработан.


LayoutRoot.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>(LayoutRoot_ManipulationCompleted);

В обработчике события мы пытаемся определить жесты и используем оператор switch для более точного определения типа жеста.


void LayoutRoot_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
	while (TouchPanel.IsGestureAvailable)
	{
		GestureSample gesture = TouchPanel.ReadGesture();

		switch (gesture.GestureType)
		{
			case GestureType.Tap:
				GestureText.Text = "Tap";
				break;
			case GestureType.DoubleTap:
				GestureText.Text = "Double Tap";
				break;
			case GestureType.Hold:
				GestureText.Text = "Hold";
				break;
			case GestureType.Flick:
				GestureText.Text = "Flick";
				break;
			case GestureType.Pinch:
				GestureText.Text = "Pinch";
				break;
		}
	}
}

В нашем примере мы просто выводим текст при распознавании различных типов жестов. Естественно, вы можете написать более интересные примеры. Кстати, напоминаю, что в Дне 21 мы рассматривали GestureListener, который входит в состав Silverlight Toolkit for Windows Phone.