Статьи

Нет поддержки акселерометра в эмуляторе Windows Phone 7? Не конец.

Да, эмулятору Windows Phone 7 действительно не хватает поддержки акселерометра. Хотя вы все еще можете разрабатывать приложения для Windows Phone 7, которые используют возможности акселерометра, вы не можете проверить их в текущей версии эмулятора. Учитывая количество существующих приложений, которые используют акселерометр в качестве основы своей деятельности, это может стать серьезной проблемой для разработки. Так что в данный момент вы мало что можете с этим поделать, или нет?

Как обрабатывается активность акселерометра?

В приложении Silverlight для Windows Phone 7 активность акселерометра обрабатывается с помощью экземпляра класса Accelerometer , члена пространства имен Microsoft.Devices.Sensors . Обработчиком событий, который отслеживает активность, является ReadingChanged, и он постоянно запускается для проверки значений для позиционирования X, Y и Z после размещения вызова Start для экземпляра акселерометра . Чтение датчика прекращается при нажатии на Стоп для того же экземпляра акселерометра. Вот пример:

// Constructor
public MainPage()
{
InitializeComponent();
Accelerometer accelerometer = new Accelerometer();
accelerometer.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(accelerometer_ReadingChanged);
accelerometer.Start();
}

void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
Debug.WriteLine(string.Format("X: {0} Y: {1} Z: {2}",e.X,e.Y,e.Z));
}

Для этого примера акселерометр будет постоянно считывать данные и записывать их в консоль вывода :

Положение телефона по умолчанию установлено на X = 0 , Y = 0 и Z = -1 . По сути, это означает, что телефон лежит так:

Это легко понять, если вы понимаете положение объекта в трехмерной сетке. Если вы не хотите самостоятельно определять позиции по умолчанию, вы можете просто посетить эту страницу, чтобы получить список основных значений.

Но так как эти значения неизменны на данный момент, что вы могли бы сделать?

Использовать мышь

Для тестирования вы можете использовать мышь. Даже если устройство Windows Phone 7 не имеет аппаратной или программной поддержки мыши, вы все равно можете использовать его при разработке приложения. Хотя он не предоставляет полный набор возможностей (например, ему не хватает движения по оси Z), для большинства случаев достаточно проверить наклон телефона влево и вправо (и даже вверх и вниз).

Для этого все, что вам нужно сделать, это создать ссылку на обработчик события MouseMove.

this.MouseMove += new MouseEventHandler(MainPage_MouseMove);

Затем вы можете непосредственно прочитать позицию курсора, вызвав метод GetPosition:

void MainPage_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine(string.Format("X: {0} Y: {1}", e.GetPosition(this).X, e.GetPosition(this).Y));
}

Положение занято относительно текущей страницы, и как только вы щелкнете мышью и перетащите ее внутрь страницы, вы увидите изменяющиеся значения X и Y.

Имейте в виду, что это никоим образом не заменит существующую функциональность ускорителя, но, поскольку эмулятор не поддерживает его вообще, этот метод можно считать временным обходным решением.

Это единственный способ?

Нет. Были представлены и другие методы. Например, Билл Рейсс использовал WiiMote (через WiimoteLib для .NET ) для имитации данных акселерометра. Пользовательский обработчик событий, а также сам пользовательский класс акселерометра были написаны от руки, поэтому класс Accelerometer по умолчанию остался без изменений. Этот метод также включает подключение к веб-службе (прокси-сервер Wiimote) для получения данных, поэтому существует главный недостаток — возможность задержки между фактическими полученными данными и обработкой данных акселерометром. Примерно с той же идеей были эксперименты по созданию других телефонов для генерации данных акселерометра , которые затем передаются в веб-службу, а затем считываются приложением Windows Phone 7.

Надеемся, что в одном из следующих выпусков эмулятора Windows Phone 7 мы увидим реализацию, которая позволит имитировать движение акселерометра, по крайней мере, из-за кода (например, возможность передавать определенные аргументы тестового акселерометра). На данный момент единственным способом будет либо тестирование на реальном устройстве Windows Phone 7, либо использование одного из представленных обходных путей.