2011-06-20 6 views
1

私は別のキャンバス(大きいサイズ)をロードしている1つの外側キャンバスを持っています。内部(大)キャンバスの一部だけが画面に表示されるようにクリップのジオメトリを設定しました。最初の縮尺が1未満のキャンバスピンチとズーム

インナーキャンバスのサイズが大きいので、インナーキャンバスの最初の縮尺を0.4に保っています。つまり、内側のキャンバスにコンポジット変換を適用し、scaleXとscaleYを0.4にしました。

今、私はジェスチャーリスナーメソッドOnPinchStartとOnPinchDeltaを実装しました。 OnPinchDeltaではキャンバスをズームしています。

問題は、最初の縮尺が0.4なので縮尺が達する(または縮尺が1になる)まで、キャンバスが中央からズーミングしていないということは、その位置が変更されたことを意味します。ただし、倍率が1に達するとすぐにキャンバスのズームが適切に開始されます。

縮尺率が1未満の場合は、中心からのズーミングが起こっていないため、キャンバスの位置が適切でない場合があります。

私は多くの異なるアプローチを試みましたが、1未満のスケールファクタは私にとっては適切に機能しません。助けてください。

+0

PinchDeltaのCanvas.LeftとCanvas.TopにHorizo​​ntalChangeを掛け合わせてみませんか? –

+0

あなたはCanvas.SetLeftとCanvas.SetTopメソッドを言うつもりですか? – pratik

+0

私は、より詳細な説明を –

答えて

0
var factor = // calculate this based on amount of data and the speed 
var width = // element rendered width 
var height = // element rendered height 
var changeInWidth = (1-factor) * width; // can be 0, neg or pos 
var changeInHeight = (1-factor) * height; 
var changeInX = changeInWidth/2; 
var changeInY = changeInHeight/2; 

Canvas.SetLeft(element, Canvas.GetLeft(element) + changeInX); 
Canvas.SetTop(element, Canvas.GetTop(element) + changeInY); 

要素がCanvasでラップされていることを確認してください。そうしないと、LeftとTopは無視されます。

因子を計算するには、e.DistanceRatioを使用できます。 これは因子として使用できますが、ズームの速度を上げる(たとえば1.2)または下げる(0.8)ようにするには定数で乗算することができます。

+0

の下に追加します。ありがとう、要素(ピンチデルタイベント内)を計算する方法を教えてください。また、「あなたの要素がCanvasによってラップされていることを確認してください。私は1つの外側のキャンバスに置かれた内側のキャンバスを持っています。 – pratik

+0

キャンバスに関して、あなたの構造はOKです。私は要因についてのコメントを追加しました。また、このリンクは便利です:http://alvaropeon.wordpress.com/2011/03/10/implementing-pinch-to-zoom-images-in-wp7/ –

+0

私はスケールを内部に適用する前にこれらの設定を行う必要がありますキャンバス、またはそれ以降は、任意のスケールファクタに対してのみ1未満のスケールでも使用できます。 – pratik