初期縮尺が1未満のキャンバスピンチとズーム

windows-phone-7
初期縮尺が1未満のキャンバスピンチとズーム

外側のキャンバスが1つあり、その内側に別のキャンバス(大きなサイズ)をロードしています。 クリップジオメトリを設定したので、画面には内側(大きな)キャンバスの一部のみが表示されます。

内側のキャンバスはサイズが大きいため、内側のキャンバスの初期スケールは0.4に保っています。 内側のキャンバスに複合変換を適用し、scaleXとscaleYを0.4にしました。

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

問題は、初期スケールが0.4であるため、スケールが到達するまで(またはスケールが1を超えるまで)、キャンバスが中心からズームされないことを意味します。つまり、位置が変更されます。 ただし、倍率が1に達する(または交差する)とすぐに、キャンバスのズームが適切に開始されます。

つまり、倍率が1未満の場合、ズームは中央または他の方法から行われず、キャンバスの位置は適切なままになりません。

さまざまなアプローチを試しましたが、1未満のスケールファクターは適切に機能していません。 どんな助けでも。

  1  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


タイトルとURLをコピーしました