Новое место для проектов Windows Phone 7…
Сайт CodePlex одно из самых (самое?) главных мест, где можно найти проекты по Windows Phone 7. Это место отвечает основным требованиям большинства программистов, предоставляя свободно доступные проекты, которые могут содержать исходные коды, исполняемые файлы, документацию, рабочие элементы, обсуждения и которые прямо встраиваются в Visual Studio. Тем не менее, все люди разные и имеют различные потребности и предпочтения.
Однако появилось новое место, во всяком случае, для разработчиков Windows Phone 7, где могут располагаться такие проекты. Место, которое многие из орбиты Microsoft могли бы не рассматривать или даже не слышать о нем, но которое в ретроспективе можно понять…
Кто же завел такой загадочный сайт для проектов? Nokia! Да, это Nokia.
И достаточно удивительно, что сегодняшний проект находится там и пришел к нам через комментарий, оставленный в предыдущем сообщении.
Простой пример на Silverlight демонстрирует использование акселерометров для вычисления наклона устройства и представление результатов в виде традиционного ватерпаса.
General
Ватерпас на Silverlight является переносом приложения Qt Bubble Level на Silverlight. Подробнее о переносе можно прочитать на странице, описывающей историю портирования.
Специально стоит отметить страницы wiki, где можно найти замечательную историю о том, как создавался проект, и как было выполнено портирование.
Это простое приложение, но порой простота – это все, что вам нужно (количество – не главное). Вот снимок проекта и фрагмент кода.
/// <summary>
/// Updates the position of the bubble in the glass tube.
/// </summary>
/// <param name="e">Contains the accelerometer reading value.</param>
protected void UpdateBubble(AccelerometerReadingEventArgs e)
{
const double RADIANS_TO_DEGREE = 57.2957795;
double divider = Math.Sqrt(e.X * e.X + e.Y * e.Y + e.Z * e.Z);
// Calculating the angle + using low pass factor 20 %.
// Values from all three accelerometers are used to get more precise reading on y-axis.
m_Angle += (Math.Acos(e.Y / divider) * RADIANS_TO_DEGREE - 90 - m_Angle) * 0.2;
double angle;
// Depending on the orientation, invert the accelerometer value
if (Orientation == PageOrientation.LandscapeLeft)
{
angle = -m_Angle + m_CalibrationFactor;
}
else
{
angle = m_Angle - m_CalibrationFactor;
}
const double MAX_ANGLE = 20.0;
// Restrict the angle value to the range -20 and 20 degrees.
if (angle > MAX_ANGLE)
{
angle = MAX_ANGLE;
}
else if (angle < -MAX_ANGLE)
{
angle = -MAX_ANGLE;
}
// Set the bubble position.
BubbleTransform.X = angle / MAX_ANGLE * (Reflection.Width / 2 - Bubble.Width / 2);
}