2013-02-01 8 views
14

にパン私はピンチズームを実現するために管理し、(イメージコントロール上)ManipulationDeltaとManipulationStartedイベントをフックすることにより、パンました:滑らかなピンチズームやWindowsの携帯電話8

private void image_OnManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     var transform = (CompositeTransform)image.RenderTransform; 

     // pan 
     transform.TranslateX = _translationX + e.CumulativeManipulation.Translation.X; 
     transform.TranslateY = _translationY + e.CumulativeManipulation.Translation.Y; 

     // zoom 
     if (e.PinchManipulation != null) 
     { 
      transform.CenterX = e.PinchManipulation.Original.Center.X; 
      transform.CenterY = e.PinchManipulation.Original.Center.Y; 

      transform.ScaleX = _scaleX * e.PinchManipulation.CumulativeScale; 
      transform.ScaleY = _scaleY * e.PinchManipulation.CumulativeScale; 
     } 
    } 

    private void image_OnManipulationStarted(object sender, ManipulationStartedEventArgs e) 
    { 
     // the user has started manipulating the screen, set starting points 
     var transform = (CompositeTransform)image.RenderTransform; 
     _scaleX = transform.ScaleX; 
     _scaleY = transform.ScaleY; 
     _translationX = transform.TranslateX; 
     _translationY = transform.TranslateY; 
    } 

しかしに比べWindowsの残りの部分の滑らかさは、それが非常に穏やかで堅い感じUIを電話。動きに慣性はありません。

動きを滑らかにする方法はありますか?アニメーションやストーリーボードを使用していますか?私は少なくともスムーズなパンニングを得るためにScrollViewを使用しようとしましたが、その後、ManipulationDeltaイベントは正しく発射されません。

+0

を解決するのに役立つ可能性があり、別のサンプルプロジェクトの問題としてだけで更新が人気があるようですです:私は上記のコードをプログラムで作成したアニメーションと組み合わせて、その "慣性"を感じるようにしました。私はまた、スムーズに動作するように、単純なコントロール(キャンバスとビットマップキャッシュイメージ)を使用して最適化する必要がありました。 – Pking

+0

重複している可能性があります - ここで詳しく説明します。 [http://stackoverflow.com/questions/13969400/pinch-to-zoom-functionality-in-windows-phone-8](http://stackoverflow.com/questions/13969400/pinch-to-zoom-functionality- in-windows-phone-8) –

答えて

5

私はこのことを数学的な観点から考えたかったのです。結果は、TelerikのPanAndZoomImageと似ています。興味がない場合は、gistに直接ジャンプしてください(WP7.1 +で動作します)。 System.Windows.InteractivityとWindows Phoneツールキットを参照する必要があります。

使用:

<Image Source="http://i.imgur.com/ZbKlRzK.jpg"> 
    <i:Interaction.Behaviors> 
     <phoneApp1:PanAndZoomBehavior MaxZoom="10" /> 
    </i:Interaction.Behaviors> 
</Image> 

数学

パニングとズーミングはCompositeTransformの2~4のうちの変換、すなわち翻訳及びスケーリングを使用します。 重要な点は、これらのスケール変換変換のうちの2つをどのように合成するかを理解することです。私はタイプリーディングと読み込みの負担が少ないので、ハッセル表記を使用します。私達の 'プリミティブ' はある

  1. scale s周り=スケール(SX、SY)は、Y方向における第X因子の方向SXおよびSYと
  2. translate t = Y方向
  3. にx方向及びTYにおけるTXによってすべての点をオフセット

CompositeTransformは、以下の規則が保持

scaleAround c s = translate c . scale s . translate -c 

のように表現された中心点を中心にスケール(もしあれば計算を行います)すべての演算子が要素ごといる、私を信じていない:

  1. translate a . translate b = translate (a+b)
  2. scale a . scale b = scale (a*b)
  3. translate t . scale s = scale s . translate (t/s)

これらの変換の2を構成するときA CompositeTransformが

transform s c t = translate t . scaleAround c s 
       = translate (t+c) . scale s . translate -c 

のようなものです、我々はsに到達するまで、プリミティブを移動しなければならない上記のフォームをuchしてください。abを2つのコンポジットトランスフォームとします。

これは、特定の人々が特定のことをする理由についての深遠な文書の量に私が不満を持っていたためです。実際の組成コードの場合

、looko here