Winrt, датчик орієнтації екрану

За останні роки комп'ютери в ході своєї еволюції обзавелися новими «органами почуттів». Ні, це не сюжет нового фантастичного фільму! Багато комп'ютерів - особливо планшетні та інші мобільні пристрої - оснащені обладнанням, яке дозволяє машині визначити свою орієнтацію в тривимірному просторі, своє місцезнаходження на поверхні Землі, інтенсивність зовнішнього освітлення і навіть швидкість повороту комп'ютера в руках користувача.

Всі ці пристрої об'єднуються під загальною назвою датчиків (sensors). а програмний інтерфейс для роботи з ними знаходиться в основному в просторі імен Windows.Devices.Sensors. тоді як класи, за допомогою яких програма визначає своє географічне місцезнаходження, знаходяться в просторі імен Windows.Devices.Geolocation. Устаткування для позиціонування часто неформально називають GPS (за назвою супутникової системи GPS), хоча комп'ютер також часто може визначити своє географічне положення по мережевому підключенню.

Щоб отримати максимум користі від цього матеріалу, слід взяти комп'ютер, на якому запущені програми-приклади, і перемістити його в просторі. Якщо ваша машина розробки з системою Windows 8 прикута до столу (як і моя), візьміть планшет - наприклад, Microsoft Surface - і розгорніть програми на ньому в віддаленому режимі.

орієнтація

Найпростішим з усіх класів датчиків є клас SimpleOrientationSensor; він дає програмі приблизне уявлення про орієнтацію в тривимірному просторі, але без особливих подробиць. Для отримання примірника SimpleOrientationSensor викликається статичний метод:

Ця операція виконується в додатку тільки один раз, так що код може виконуватися в визначенні поля для надання доступу до цього об'єкта в класі.

Якщо метод GetDefault () повертає null, комп'ютер не має коштів для визначення своєї орієнтації.

Значення, яке описує поточну орієнтацію, може бути в будь-який момент часу отримано від об'єкта SimpleOrientationSensor:

Перерахування SimpleOrientation складається з шести значень:

Саме через обмеженість цієї інформації клас SimpleOrientationSensor називається «простим» (simple).

Також програма може отримувати оповіщення про події при зміні орієнтації. Призначте обробник для події OrientationChanged:

Подія ініціюється тільки при зміні орієнтації, чого не відбудеться, якщо комп'ютер залишається відносно нерухомим. Якщо для роботи програми необхідно вихідне значення, викличте метод GetCurrentOrientation після призначення обробника події.

Обробник події виконується у власному потоці, тому для взаємодії з потоком користувальницького інтерфейсу необхідно використовувати об'єкт CoreDispatcher:

Аргумент події з дуже довгим ім'ям містить властивість Orientation перечислимого типу SimpleOrientation і властивість Timestamp типу DateTimeOffset. Резонно запитати: а хіба ми не володіємо інформацією про орієнтацію пристрою? Хіба вона не надається простором імен Windows.Graphics.Display? Хіба клас DisplayProperties і його статичні властивості NativeOrientation і CurrentOrientation, а також подія OrientationChanged не надають інформацію про орієнтацію? Нагадаю, що ці два статичних властивості повертають значення перечислимого типу DisplayOrientations: Landscape, Portrait, LandscapeFlipped, PortraitFlipped.

Класи SimpleOrientationSensor і DisplayProperties безумовно пов'язані, але важливо зрозуміти суть цієї зв'язку: клас SimpleOrientationSensor описує орієнтацію комп'ютера в тривимірному просторі. Властивість DisplayProperties.CurrentOrientation описує, яким чином Windows компенсує орієнтацію комп'ютера за допомогою автоматичної зміни орієнтації вікна вашої програми. Інакше кажучи, SimpleOrientationSensor повідомляє інформацію про орієнтацію обладнання, a DisplayProperties.CurrentOrientation - інформацію про зміну орієнтації програми, яка сталася у відповідь на зміну орієнтації обладнання.

Проект OrientationAndOrientation допоможе вам розрізняти два види орієнтації. Файл XAML визначає кілька елементів TextBlock для виведення міток і даних:

Файл фонового коду визначає два методи з єдиною метою - завданням двох елементів TextBlock в другому стовпці Grid. Ці два методи викликаються як з конструктора для завдання вихідних значень, так і з двох обробників подій:

Зверніть увагу: екземпляр SimpleOrientationSensor створюється як поле, але конструктор перевіряє можливе значення null перед зверненням до об'єкта.

Якщо запустити цю програму на планшеті з основною альбомної орієнтацією (тобто у якого властивість DisplayProperties.NativeOrientation повертає DisplayOrientations.Landscape) і якщо ви нічого не зробили для того, щоб перешкодити Windows 8 змінити орієнтацію (наприклад, помістивши планшет і стикувальний вузол - док станцію), то при послідовному повороті планшета за годинниковою стрілкою два індикатора орієнтації будуть пов'язані наступним чином:

Значення датчика орієнтації (SimpleOrientationSensor) і пристрої (DisplayProperties.CurrentOrientation) при альбомної орієнтації