#c# #silverlight #windows-phone-7 #gesture
#c# #silverlight #windows-phone-7 #жест
Вопрос:
У меня есть изображение в scrollviewer.На изображении реализована функция ввода и вывода. Но при прокрутке увеличенного изображения соотношение сторон изменяется, и изображения искажаются. Следуя xaml:
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="scroller" >
<Image Name="image_new" Visibility="Visible" CacheMode="BitmapCache" >
<Image.RenderTransform >
<CompositeTransform x:Name="transform"/>
</Image.RenderTransform >
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Flick="OnFlick" PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta" DoubleTap="Onimage_doubletap" Tap="Onimage_singletap" />
</toolkit:GestureService.GestureListener>
</Image>
</ScrollViewer>
А в файле .cs методы следующие :
private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e)
{
Point point0 = e.GetPosition(image_new, 0);
Point point1 = e.GetPosition(image_new, 1);
Point midpoint = new Point((point0.X point1.X) / 2, (point0.Y point1.Y) / 2);
image_new.RenderTransformOrigin = new Point(midpoint.X / image_new.ActualWidth, midpoint.Y / image_new.ActualHeight);
initialScale = transform.ScaleX;
}
private void OnPinchDelta(object sender, PinchGestureEventArgs e)
{
transform.ScaleX = Math.Max(Math.Min(initialScale * e.DistanceRatio, 3.0), 0.5);
transform.ScaleY = Math.Max(Math.Min(initialScale * e.DistanceRatio, 3.0), 0.5);
}
Ответ №1:
Я думаю, проблема здесь в том, что вы меняете RenderTransformOrigin для каждого жеста ущипывания, что приводит к искажению. Я бы попробовал оставить RenderTransformOrigin фиксированным на 0,5, 0,5, чтобы гарантировать, что вы получите равномерный масштаб.
Я предполагаю, что вы перемещали начало координат, чтобы попытаться увеличить / уменьшить часть изображения, на которой пользователь запустил жест. Для достижения этого, я думаю, вам нужно будет разрешить пользователю перемещаться по изображению после увеличения.
Еще один момент, масштабный коэффициент всегда одинаков, поэтому вы должны просто вычислить его один раз, а затем присвоить его как scaleX, так и scaleY.
Комментарии:
1. Спасибо за ответ… Для панорамирования я использовал средство просмотра прокрутки, чтобы пользователь мог прокручивать изображение по горизонтали или вертикали для панорамирования. Но при панорамировании изображение искажается. Я исправил значение RenderTransformOrigin на 0.5, 0.5 но проблема по-прежнему сохраняется.
2. Хм… интересно. Если вы можете опубликовать проект или простое воспроизведение где-нибудь, я могу взглянуть более подробно.