Датчики, которые можно использовать в приложении Магазина Windows, — великолепный способ добавить изюминку в его функциональность. С помощью датчиков приложение узнает о взаимодействии устройства с окружающим физическим миром — направлении, ориентации и движении. Датчики позволяют сделать игру, приложение с функцией дополненной реальности или служебную программу более полезной и интерактивной благодаря новому способу ввода информации. Например, можно использовать движение планшета для упорядочивания символов на экране или симуляции полета в кабине космического корабля, где устройство выступит в качестве штурвала.
В данной публикации мы расскажем о поддерживаемых датчиках и дадим рекомендации, как ими лучше воспользоваться. Два разных датчика создают пересекающиеся потоки данных, но один отдельный датчик обычно оказывается полезнее и эффективнее другого. Видеообзор датчиков вы можете посмотреть здесь:
Загрузите видеоролик для просмотра в предпочитаемом медиапроигрывателе.
MP4 высокого качества | MP4 низкого качества
Для получения более подробной информации о датчиках обратитесь к статье Aligning sensors with your app’s orientation.
Сценарии для различных датчиков
Общее правило: стоит сразу решить, будет ли приложение полагаться исключительно на датчики либо это просто еще один способ управления. Например, в игре — гоночном симуляторе, где планшет используется в качестве руля, можно управлять болидом с помощью графического интерфейса. Таким образом, приложение не будет привязано к датчикам устройства. С другой стороны, лабиринт с шариком можно запрограммировать исключительно для работы на устройстве с подходящими датчиками. Вам нужно принять стратегическое решение относительно того, будете ли вы полностью полагаться на датчики или нет. Не забывайте, что использование мыши и касаний экрана лучше с точки зрения управления, но лишает эффекта погружения. Если приложение привязано к датчикам, не забудьте указать это в описании, иначе вы рискуете навлечь на себя гнев пользователей, купивших приложение, но не сумевших им воспользоваться.
Акселерометр
Акселерометр измеряет ускорение силы тяжести по осям X, Y и Z устройства и прекрасно подходит для простых приложений, основанных на движении. Обратите внимание, что «значение ускорения силы тяжести» отражает ускорение из-за гравитации. Если устройство лежит на столе экраном вверх (см. Simple Orientation (Простое руководство по ориентации)), то акселерометр покажет значение –1 G по оси Z. Таким образом, акселерометр не обязательно измеряет «ускорение по координатам» — темп изменения скорости. При использовании акселерометра не забудьте делать различие между гравитационным вектором и гравитацией, а также между вектором линейного ускорения и движением. Обратите внимание, что нормальное значение гравитационного вектора для планшета в состоянии покоя должно равняться 1.
На следующей диаграмме показано, что акселерометр напоминает подвешенный на пружине груз:
Вы видите, что:
- V1 = вектор 1 = сила из-за гравитации.
- V2 = вектор 2 = ось –Z корпуса устройства (выходит из задней части экрана).
- Θi = угол наклона = угол между осью –Z корпуса устройства и вектором гравитации.
Пример 1: игра, где шарик на экране катится в том направлении, куда вы наклоняете устройство (гравитационный вектор). Подобная функциональность практически полностью повторяет функциональность инклинометра и может быть реализована с его помощью, а также посредством комбинации тангажа и крена. Использование гравитационного вектора акселерометра немного упрощает процесс благодаря тому, что вектором наклона устройства легко манипулировать математически.
Снимок экрана из примера с лабиринтом
Пример 2: приложение, издающее звук щелчка хлыстом, когда пользователь делает взмах устройством в воздухе (вектор линейного ускорения).
Гирометр
Гирометр (гироскоп) измеряет угловую скорость по осям X, Y и Z. Он очень полезен для простых, основанных на движении приложений, где важна не ориентация устройства в пространстве, а его вращение с разной скоростью. Гирометр подвержен помехам в данных и (или) систематическим ошибкам по одной или нескольким осям. Лучше всего запрашивать данные акселерометра, чтобы подтвердить движение устройства и определить, есть ли ошибки в данных гирометра. Затем можно компенсировать эти данные в приложении.
Здесь показано отношение координат устройств для гирометра
Пример: приложение, вращающее рулетку при резком круговом движении планшета.
Компас
Датчик компаса возвращает двухмерный курс по отношению к магнитному северу, основываясь на горизонтальной плоскости земли. Этот датчик идеально подходит для приложений, где нужно выяснить, в каком направлении смотрит пользователь, и где необходимо нарисовать компасную розу или стрелку. Однако мы не рекомендуем использовать его определения ориентации устройства или представления чего бы то ни было в трехмерном пространстве. Особенности географии могут вызвать естественное магнитное склонение курса, поэтому некоторые системы поддерживают как «магнитный север», так и «истинный север». Подумайте, какой из них нужен вашему приложению, но помните, что не все системы предоставляют значение «истинного севера». Гирометр и магнитометр (устройство, измеряющее величину магнитного поля) комбинируют собственные данные и вычисляют курс компаса, что в совокупности стабилизирует данные (величина магнитного поля нестабильна из-за электрических компонентов системы).
Здесь показана разница между магнитным и истинным севером
Пример: приложение, отображающее розу компаса, или навигатор.
Инклинометр
Инклинометр определяет рысканье, тангаж и крен устройства и идеально подходит для приложения, где нужно знать расположение устройства в пространстве и выразить его в виде традиционных значений рысканья, тангажа и крена. Мы получаем данные о тангаже и крене из гравитационного вектора акселерометра и интеграции данных гирометра. Мы устанавливаем значение рысканья из показаний магнитометра и гирометра (как и для курса компаса). Инклинометр предоставляет более подробные данные об ориентации устройства в простом и понятном формате. Используйте инклинометр, если вам необходимо узнать ориентацию устройства, но не нужно манипулировать данными датчиков.
На этом рисунке показан диапазон значений инклинометра
Пример: приложение, изменяющее представление в зависимости от ориентации устройства, или рисующее самолет с такими же значениями рысканья, тангажа и крена, как у устройства.
Ориентация
Ориентация устройства в пространстве выражается через кватернион и матрицу вращения. Этот датчик обладает высоким уровнем точности при определении положения устройства в пространстве относительно абсолютного курса, получаемого из данных акселерометра, гирометра и магнитометра.
Таким образом, показания инклинометра и компаса можно получить из значений кватернионов. Кватернионы и матрицы вращения хорошо подходят для математических операций и часто используются в графическом программировании. Приложения, выполняющие сложные манипуляции, должны отдавать предпочтение датчику ориентации, поскольку многие трансформеры основаны на кватернионах и матрицах вращения.
Пример: продвинутое приложение с функцией дополненной реальности, которое накладывает рисунок поверх окружения исходя из направления задней стороны устройства.
Простая ориентация устройства в пространстве
Этот датчик определяет текущую ориентацию заданного устройства по квадрантам, а также позволяет понять, вверх или вниз направлен экран. Всего доступно шесть возможных состояний: NotRotated (не повернуто), Rotated90 (повернуто на 90), Rotated180 (повернуто на 180), Rotated270 (повернуто на 270), FaceUp (экраном вверх), FaceDown (экраном вниз).
Пример: приложение для чтения, изменяющее отображение страницы в зависимости от того, расположено ли устройство перпендикулярно или параллельно земле.
Использование нескольких датчиков в одном приложении
Не забывайте, что приложение не ограничено одним датчиком. Датчик простой ориентации в пространстве хорошо сочетается с другими датчиками, если вы хотите иметь две различные функции или немного изменить функциональность. Инклинометр хорошо сочетается с гирометром; оба используют одну и ту же систему координат, где один датчик представляет позицию, а другой — скорость.
Не забывайте, что объединенный датчик технически использует несколько датчиков: датчики компас, инклинометр, ориентация комбинируют и синтезируют данные из физических датчиков (акселерометра, гирометра и магнитометра). Поэтому мы рекомендуем использовать один из объединенных датчиков (а не акселерометр и гирометр) для создания псевдокомбинированного датчика или схемы управления другого типа. Мы уже сделали всю тяжелую работу за вас!
Подведем итоги
Большое количество датчиков, поддерживаемых приложениями Магазина Windows для Windows 8.1, предлагает множество опций, повышающих интерактивность приложения. Выбирайте датчики обдуманно и правильно. Если вы воспользуетесь рекомендациями, представленными в этой статье, то ваше приложение будет работать изящно и именно так, как вы ожидаете.
— Брайан Роквелл (Brian Rockwell), руководитель программ для сенсоров в Windows
function ShowContactCard(evt) {
var ContactsNS = Windows.ApplicationModel.Contacts;
var emailAddress = document.getElementById("inputEmailAddress").value;
var phoneNumber = document.getElementById("inputPhoneNumber").value;
// Создаем входной объект contact для вызова ContactManager.showContactCard()
var contact = new ContactsNS.Contact();
// Предоставляем адрес электронной почты
var email = newContactsNS.ContactEmail();
email.address = emailAddress;
contact.emails.append(email);
// Предоставляем телефонный номер
var phone = new ContactsNS.ContactPhone();
phone.number = phoneNumber;
contact.phones.append(phone);
// Получаем прямоугольное выделения нажатой кнопки для отображения карточки контактов
var boundingRect = evt.srcElement.getBoundingClientRect();
var selectionRect = { x: boundingRect.left, y: boundingRect.top, width: boundingRect.width, height: boundingRect.height };
ContactsNS.ContactManager.showContactCard(contact, selectionRect, Windows.UI.Popups.Placement.default);
}
})
C#
/// Это обработчик нажатия для кнопки 'Show contact card'
/// <param name="sender"></param>
/// <param name="e"></param>
void ShowContactCardButton_Click(object sender, RoutedEventArgs e)
{
// Создаем входной объект contact
Contact contact = new Contact();
ContactEmail email = new ContactEmail();
email.Address = this.EmailAddress.Text;
contact.Emails.Add(email);
ContactPhone phone = new ContactPhone();
phone.Number = this.PhoneNumber.Text;
contact.Phones.Add(phone);
// Получаем прямоугольное выделение нажатой кнопки для отображения карточки контактов
Rect rect = Helper.GetElementRect(sender as FrameworkElement);
ContactManager.ShowContactCard(contact, rect, Windows.UI.Popups.Placement.Default);
}
Обработка действий карточки контактов конечным приложением
Как мы уже видели ранее, карточка контактов — это отправная точка для таких коммуникационных действий, как сообщение, звонок, электронное письмо, видео и т. п. Если ваше приложение предоставляет функциональность для обработки одного или нескольких подобных действий, оно становится для них конечным приложением. Если ваше приложение является предпочитаемым для сообщения или звонка, пользователь может запускать его из карточки контакта или средства «Поиск контактов Windows 8.1». Чтобы получить конечное приложение, сначала необходимо зарегистрировать манифесты для каждого действия, поддерживаемого вашим приложением, в категории расширений «windows.contact». Теперь приложение можно активировать для контракта с поддерживаемым действием.
В примере ниже показана регистрация манифеста для действия «Звонок» с помощью телефонного номера или идентификатора Skype.
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
<m2:Extension Category="windows.contact">
<m2:Contact>
<m2:ContactLaunchActions>
<m2:LaunchAction Verb="call" DesiredView="useLess">
<m2:ServiceId>telephone</m2:ServiceId>
</m2:LaunchAction>
<m2:LaunchAction Verb="call" DesiredView="useLess">
<m2:ServiceId>skype.com</m2:ServiceId>
</m2:LaunchAction>
</m2:ContactLaunchActions>
</m2:Contact>
</m2:Extension>
Активацию действия можно обнаружить, изучая ActivationKind в событии активации. ActivationKind — это то же самое, что и Windows.ApplicationModel.Activation.ActivationKind.contact для действий с контактами. Используйте свойство verb в аргументах события, чтобы определить тип действия с контактом. Используйте свойство serviceId в аргументах события, чтобы определить сервис, который должно использовать ваше приложение для выполнения действия (например, звонка через Skype). Приложение получает объект contact через аргументы события активации. Объект contact всегда содержит базовую информацию, необходимую для выполнения действия (например, телефонный номер для звонка). Кроме того, он содержит дополнительные сведения о контакте, например, имя и фотографию. Приложение может изучить объект contact на предмет наличия этих опциональных параметров и, если они есть, улучшить взаимодействие пользователя с приложением.
Ниже представлен фрагмент кода, демонстрирующий, как обнаруживать активацию действия «Звонок» для телефонного номера и извлекать параметры phoneNumber, name и thumbnail в JavaScript.
function activatedHandler(e) {
if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.contact) {
if (e.detail.verb === Windows.ApplicationModel.Contacts.ContactLaunchActionVerbs.Call) {
if (e.detail.serviceId == "telephone") {
var phoneNumberToCall = e.detail.serviceUserId;
var contactName = e.detail.contact.displayName;
var contactThumbnail = e.detail.contact.thumbnail;
}
}
}
}
Чтобы получить информацию об активации приложения для действий с контактом, обратитесь к примеру SDK «Обработка действий с контактами».
В заключение
Сегодня мы используем множество различных приложений — для социальных сетей, учебы, средства управления событиями, программы для отслеживания дней рождения, фитнес-приложения, социальные игры и т. п., которые применяют контакты и взаимодействуют с людьми. Если у вас имеется такое приложение в Магазине (или вы его разрабатываете), подумайте о том, как с помощью карточек контактов улучшить социальный фактор этого приложения и сделать его более привлекательным. Соединяйте свои приложения с приложением «Люди» через карточки контактов Windows, предоставляя лишь адрес электронной почты или телефонный номер либо же полную информацию. С помощью карточки контактов можно осуществлять быстрый поиск по агрегированной информации всех контактов прямо из вашего приложения. Это замечательная отправная точка, откуда пользователи могут с легкостью инициировать отправку электронного письма или сообщения, совершение звонка и т. п. с помощью предпочитаемых приложений для коммуникации. Предоставьте всю тяжелую работу Windows и исходным приложениям, а сами сосредоточьтесь на главных преимуществах своего приложения.
Во второй части этой статьи мы рассмотрим главное хранилище данных для пользователей — «Календарь» — и покажем, как упростилась интеграция приложений с пользовательскими календарями благодаря новому контракту «Календарь».