Ориентация ViewFinder с Windows Phone 7 Mango PhotoCamera
Я использую элемент управления PhotoCamera с помощью средств разработки Windows Phone 7 Mango Beta 2.
"ViewFinder" для управления камерой представляет собой объект прямоугольника, заполненный VideoBrush, как в примере здесь:
http://msdn.microsoft.com/en-us/library/hh202956%28v=VS.92%29.aspx
Моя проблема в том, что когда я запускаю приложение на своем телефоне, изображение ViewFinder всегда отображается на 90 градусов против часовой стрелки. Это имеет значение независимо от расположения телефона.
Кто-нибудь знает, как правильно ориентировать ViewFinder?
Ответы
Ответ 1
Да, ориентация - это то, что вам нужно будет сделать с помощью Относительного преобразования:
<!--Camera viewfinder >-->
<Rectangle Grid.Row="1"
x:Name="preview">
<Rectangle.Fill>
<VideoBrush x:Name="previewBrush">
<VideoBrush.RelativeTransform>
<CompositeTransform x:Name="previewTransform"
CenterX=".5"
CenterY=".5" />
</VideoBrush.RelativeTransform>
</VideoBrush>
</Rectangle.Fill>
</Rectangle>
Затем вы можете использовать класс PhotoCamera для определения того, как вы хотите его повернуть:
double cameraRotation = theCamera.Orientation;
// Use the orientation to determine how to transform
// the camera preview
previewTransform.Rotation = theCamera.Orientation + 90.0; // Landscape?
НТН
Ответ 2
Добавление большего пояснения к ответу: Одна вещь, описанная в документации, которая здесь не упоминается, заключается в том, что относительное преобразование настраивается в событии OnOrientationChanged. Другое отличие состоит в том, что относительное преобразование не указано в XAML.
В документах (Как создать приложение базовой камеры для Windows Phone) прямоугольник заполняется видеошопом следующим образом:
<!--Camera viewfinder >-->
<Rectangle Width="640" Height="480"
HorizontalAlignment="Left"
x:Name="viewfinderContainer">
<Rectangle.Fill>
<VideoBrush x:Name="viewfinderBrush" />
</Rectangle.Fill>
</Rectangle>
Затем в коде-позади событие OnOrientationChanged поворачивает прямоугольник на основе ориентации:
// Ensure that the viewfinder is upright in LandscapeRight.
protected override void OnOrientationChanged(OrientationChangedEventArgs e)
{
if (e.Orientation == PageOrientation.LandscapeRight)
{
viewfinderBrush.RelativeTransform =
new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 180 };
}
else
{
viewfinderBrush.RelativeTransform =
new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 0 };
}
base.OnOrientationChanged(e);
}
Код в этом разделе (который соответствует образцу) настроен только на использование ландшафтной ориентации, возможно, именно поэтому вы получаете только пейзажные изображения (?). Вначале к телефону добавляются следующие атрибуты: Элемент PhoneApplicationPage в MainPage.xaml:
SupportedOrientations="Landscape" Orientation="LandscapeLeft"
Если вы по-прежнему неправильно ориентированы на изображения, синхронизируйте изображения с ПК и посмотрите, правильно ли они ориентированы, когда вы просматриваете их (на вашем ПК). Это может быть ошибка с бета-версией, которая приводит к неправильному отображению изображения на устройстве.
Надеюсь, что это поможет. Приветствия
Ответ 3
Вам не нужно делать такой код, если вы находитесь в портретном режиме, просто позвоните:
viewfinderBrush.RelativeTransform
= new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90 };
Но, конечно, независимо от ориентации, которую вы используете для видоискателя, результирующее изображение все еще в ландшафте! У кого-нибудь есть идея, как лучше всего исправить это?
Ответ 4
да, я удалил OnOrientationChanged-Eventhandler и просто установил преобразование. В Xaml, конечно, я изменил ориентацию на портрет.
Теперь видоискатель показывает портрет, а страница - портрет. Но изображение сохраняется как миниатюра для рулона камеры, поэтому я могу видеть непосредственно на устройстве, что захваченное изображение имеет неподвижную ландшафтную ориентацию.
Было бы здорово, если бы кто-то мог проверить, что это ошибка Beta, или если мы только что сделали какой-то глупый код здесь;)
Спасибо.