DirectX でシーンをレンダリングしている Windows ユニバーサル アプリがあります。Scrollviewer を利用したいので、Scrollviewer の背後にあるシーンをレンダリングし、Scrollviewer に基づいてシーンの変換を計算したいと考えています。これまでのところ、特に翻訳とスクロールはうまく機能しています。しかし、ズームインすると、2 つの特別な状況でシーンがジャンプします。
- シーンには十分なスペースがあり、中央に配置されていたため、スクロールが必要になりました。
- 反対方向。
多かれ少なかれ、次のコードを使用します。
float zoom = scrollViewer.ZoomFactor;
float inverseZoom = 1f / scrollViewer.ZoomFactor;
float scaledContentW = Document.Size.X * scrollViewer.ZoomFactor;
float scaledContentH = Document.Size.Y * scrollViewer.ZoomFactor;
float translateX;
float translateY;
if (scaledContentW < scrollViewer.ViewportWidth)
{
translateX = ((float)scrollViewer.ViewportWidth * inverseZoom - Document.Size.X) * 0.5f;
}
else
{
translateX = -inverseZoom * (float)scrollViewer.HorizontalOffset;
}
if (scaledContentH < scrollViewer.ViewportHeight)
{
translateY = ((float)scrollViewer.ViewportHeight * inverseZoom - Document.Size.Y) * 0.5f;
}
else
{
translateY = -inverseZoom * (float)scrollViewer.VerticalOffset;
}
float visibleX = inverseZoom * (float)scrollViewer.HorizontalOffset;
float visibleY = inverseZoom * (float)scrollViewer.VerticalOffset; ;
float visibleW = Math.Min(Document.Size.X, inverseZoom * (float)scrollViewer.ViewportWidth);
float visibleH = Math.Min(Document.Size.Y, inverseZoom * (float)scrollViewer.ViewportHeight);
Rect2 visibleRect = new Rect2(visibleX, visibleY, visibleW, visibleH);
transform =
Matrix3x2.CreateTranslation(
translateX,
translateY) *
Matrix3x2.CreateScale(zoom);
ここで例を取得できます: https://github.com/SebastianStehle/Win2DZoomTest
私の目が壊れていないことを確認するために、ズームして、翻訳とズームの値をファイルに書き込んでいます。ここで見ることができます:
https://www.dropbox.com/s/9ak6ohg4zb1mnxa/Test.png?dl=0
列の意味は次のとおりです。
列 1: 変換マトリックス (M11) の計算されたズーム値 = ScrollViewer.ZoomFactor 列 2: マトリックスの計算された x オフセット (上記を参照) 列 3: マトリックス * ベクトル (500, 500) の結果の x 値、ここでは:Colum1 * 500 + Column2
ご覧のとおり、行列の値は適切に見えますが、変換を適用すると、数ミリ秒間右に小さなジャンプが発生します。1 つの理論は、スクロールバーが表示されるため、ビューポートが変更される可能性があるというものでした。しかし、そうではありません。ここでも固定値を試し、スクロールバーを表示し、スクロールバーのないスクロールビューアー用のカスタム テンプレートを作成しました。
ところで:これはクロスポストです。私もここで質問しました:https ://github.com/Microsoft/Win2D/issues/125