2011-02-03 157 views
5

我發現這雙指縮放例如在http://forums.create.msdn.com捏放大圖像?

這裏是XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
      <StackPanel> 
       <TextBlock Text="Tap to center" Style="{StaticResource PhoneTextNormalStyle}"/> 
       <TextBlock Text="Tap and hold to reset" Style="{StaticResource PhoneTextNormalStyle}"/> 
       <TextBlock Text="Touch and move to drag" Style="{StaticResource PhoneTextNormalStyle}"/> 
       <TextBlock Text="Pinch (touch with two fingers) to scale and rotate" Style="{StaticResource PhoneTextNormalStyle}" TextWrapping="Wrap"/> 
       <TextBlock Text="Flick (drag and release the touch while still moving) will show flick data on bottom of screen." Style="{StaticResource PhoneTextNormalStyle}" TextWrapping="Wrap"/> 
      </StackPanel> 
      <TextBlock x:Name="flickData" Text="Flick:" Style="{StaticResource PhoneTextNormalStyle}" VerticalAlignment="Bottom"/> 
      <Image x:Name="image" Source="/map.jpg" RenderTransformOrigin="0.5,0.5" CacheMode="BitmapCache"> 
       <Image.RenderTransform> 
        <CompositeTransform x:Name="transform"/> 
       </Image.RenderTransform> 
       <toolkit:GestureService.GestureListener> 
        <toolkit:GestureListener 
         Tap="OnTap" Hold="OnHold" 
         DragStarted="OnDragStarted" DragDelta="OnDragDelta" DragCompleted="OnDragCompleted" 
         Flick="OnFlick" 
         PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta" PinchCompleted="OnPinchCompleted"/> 
       </toolkit:GestureService.GestureListener> 
      </Image> 
     </Grid> 

和CS來源:

public partial class GestureSample : PhoneApplicationPage 
    { 
     double initialAngle; 
     double initialScale; 

     public GestureSample() 
     { 
      InitializeComponent(); 
     } 

     private void OnTap(object sender, GestureEventArgs e) 
     { 
      transform.TranslateX = transform.TranslateY = 0; 
     } 

     private void OnDoubleTap(object sender, GestureEventArgs e) 
     { 
      transform.ScaleX = transform.ScaleY = 1; 
     } 

     private void OnHold(object sender, GestureEventArgs e) 
     { 
      transform.TranslateX = transform.TranslateY = 0; 
      transform.ScaleX = transform.ScaleY = 1; 
      transform.Rotation = 0; 
     } 

     private void OnDragStarted(object sender, DragStartedGestureEventArgs e) 
     { 
      image.Opacity = 0.3; 
     } 

     private void OnDragDelta(object sender, DragDeltaGestureEventArgs e) 
     { 
      transform.TranslateX += e.HorizontalChange; 
      transform.TranslateY += e.VerticalChange; 
     } 

     private void OnDragCompleted(object sender, DragCompletedGestureEventArgs e) 
     { 
      image.Opacity = 1.0; 
     } 

     private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e) 
     { 
      Point point0 = e.GetPosition(image, 0); 
      Point point1 = e.GetPosition(image, 1); 
      Point midpoint = new Point((point0.X + point1.X)/2, (point0.Y + point1.Y)/2); 
      image.RenderTransformOrigin = new Point(midpoint.X/image.ActualWidth, midpoint.Y/image.ActualHeight); 
      initialAngle = transform.Rotation; 
      initialScale = transform.ScaleX; 
      image.Opacity = 0.8; 
     } 

     private void OnPinchDelta(object sender, PinchGestureEventArgs e) 
     { 
      transform.Rotation = initialAngle + e.TotalAngleDelta; 
      transform.ScaleX = transform.ScaleY = initialScale * e.DistanceRatio; 
     } 

     private void OnPinchCompleted(object sender, PinchGestureEventArgs e) 
     { 
      image.Opacity = 1.0; 
     } 

     private void OnFlick(object sender, FlickGestureEventArgs e) 
     { 
      flickData.Text = string.Format("{0} Flick: Angle {1} Velocity {2},{3}", 
       e.Direction, Math.Round(e.Angle), e.HorizontalVelocity, e.VerticalVelocity); 
     } 
    } 

它的工作原理相當不錯的小圖像(少然後是2000x2000像素)。但在我的例子中,我有這張巨大的地鐵地圖(http://www.vasttrafik.se/upload/Linjekartor_hogupplost/Goteborg2010/Linjen%C3%A4tskarta-101212.png或矢量http://www.vasttrafik.se/upload/Linjekartor_hogupplost/Goteborg2010/Linjen%C3%A4tskarta-101212.pdf)。如果用戶可以縮放矢量圖像,甚至導入如此巨大的矢量是一個嚴重的性能問題,那就更好了。

也許我可能分裂圖像成幾個「多尺度圖像」,並使用此http://dotnetbyexample.blogspot.com/2010/08/windows-phone-7-multi-touch-panzoom.html,但我真的不知道如何使用他的課:(

任何想法?你會如何解決傢伙這個問題呢?

感謝

理查德

回答

6

您的解決方案的理想方法是使用MultiScaleImage,這是專門設計用於顯示大圖像數據。但是,要與MultiScaleImage配合使用,您需要準備好正確格式的iamge數據。基本上,您需要將圖像切片並重新縮放等,以便用戶在放大和縮小圖像時加載儘可能少的信息。

DeepZoom documentation描述了該過程,並鏈接到DeepZoom Composer工具,該工具用於準備圖像數據。

一旦你有MultiScaleImage方法的工作,你可以看看使用Laurent的多點觸控行爲(如果需要)來提供額外的用戶交互。

+0

感謝您的回覆。沒有成功壽! 我已經設法查看我的手機上的多尺度圖像,但它需要永久加載和交互不會工作。 下面是DPI文件: http://www50.zippyshare.com/v/82097441/file.html 而我XAML: Richard 2011-02-03 13:49:22

1

手機上的Silverlight UIElements存在大小限制。正如您發現的那樣,這是2000x2000像素。沒有一個單一的控制可以比這個更大 - 因此你的問題。

如果您使用大於此值的圖片,請看MultiScaleImage

如果您使用非常大的圖像文件,請注意內存問題。