以前の回答で述べたように、WP8専用アプリを構築している場合は、ピンチおよびズーム効果に新しいManipulationDeltaEventArgs.PinchManipulationを使用できます。ManipulationDeltaEventArgs.PinchManipulationデータを使用して画像を拡大縮小、移動、回転する方法の基本的な例を次に示します。
まず、グリッドの中央にホバリングする基本的な画像を作成します。
<Grid x:Name="ContentPanel">
<Image Source="Assets\Headset.png"
Width="200" Height="150"
ManipulationDelta="Image_ManipulationDelta"
x:Name="img"
>
<Image.RenderTransform>
<CompositeTransform CenterX="100" CenterY="75" />
</Image.RenderTransform>
</Image>
</Grid>
次に、ManipulationDeltaイベントを処理し、それがピンチマニピュレーションであるかどうかを確認し、UIElementに正しいSilverlight変換を適用します。
private void Image_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
if (e.PinchManipulation != null)
{
var transform = (CompositeTransform)img.RenderTransform;
// Scale Manipulation
transform.ScaleX = e.PinchManipulation.CumulativeScale;
transform.ScaleY = e.PinchManipulation.CumulativeScale;
// Translate manipulation
var originalCenter = e.PinchManipulation.Original.Center;
var newCenter = e.PinchManipulation.Current.Center;
transform.TranslateX = newCenter.X - originalCenter.X;
transform.TranslateY = newCenter.Y - originalCenter.Y;
// Rotation manipulation
transform.Rotation = angleBetween2Lines(
e.PinchManipulation.Current,
e.PinchManipulation.Original);
// end
e.Handled = true;
}
}
// copied from http://www.developer.nokia.com/Community/Wiki/Real-time_rotation_of_the_Windows_Phone_8_Map_Control
public static double angleBetween2Lines(PinchContactPoints line1, PinchContactPoints line2)
{
if (line1 != null && line2 != null)
{
double angle1 = Math.Atan2(line1.PrimaryContact.Y - line1.SecondaryContact.Y,
line1.PrimaryContact.X - line1.SecondaryContact.X);
double angle2 = Math.Atan2(line2.PrimaryContact.Y - line2.SecondaryContact.Y,
line2.PrimaryContact.X - line2.SecondaryContact.X);
return (angle1 - angle2) * 180 / Math.PI;
}
else { return 0.0; }
}
これが私たちがしたことです:
- スケーリング: PinchManipulationは実際にスケーリングを追跡するため、PinchManipulation.CumulativeScaleをスケーリング係数に適用するだけです。
- 変換: PinchManipulationは、元の中心と新しい中心(2つのタッチポイント間で計算)を追跡します。古い中心から新しい中心を引くことにより、UIElementが移動する必要がある量を判断し、それを変換変換に適用できます。ここでのより良い解決策は、このコードでは行われない累積的な元のセンターを追跡することによって、複数の操作セッションも考慮に入れることに注意してください。
- 回転: 2つのタッチポイント間の角度を計算し、それを回転変換として適用しました。詳細については、このNokiawikiの記事@ WindowsPhone8マップコントロールのリアルタイムローテーションをご覧ください。
このコードが正常に実行されることを示すいくつかの印刷画面を次に示します。