WinRT(或WPF)ScaleTransformation如何影响平移运动
本文关键字:影响 运动 WPF ScaleTransformation WinRT 何影响 | 更新日期: 2023-09-27 18:28:34
我已经为一个问题挣扎了好几天了。我相信我已经接近了,但解决方案一直在躲避我
我有一个画布,可以动态放置不同的形状。使用ManipulationDelta事件,我允许用户移动形状。在这个事件中,我还获得了窗口的边界,并使用它们来防止用户将形状拖离屏幕。所有这些目前都有效。
void OnShapeManipulation(object sender, ManipulationDeltaRoutedEventArgs e)
{
Shape shape = sender as Shape;
CompositeTransform tt = shape.RenderTransform as CompositeTransform;
tt.TranslateX += e.Delta.Translation.X;
tt.TranslateY += e.Delta.Translation.Y;
double top = Window.Current.Bounds.Top;
double bottom = Window.Current.Bounds.Bottom ;
double right = Window.Current.Bounds.Right ;
double left = Window.Current.Bounds.Left ;
if (tt.TranslateY < top)
tt.TranslateY = top;
if (tt.TranslateY > (bottom - shape.ActualHeight))
tt.TranslateY = bottom - shape.ActualHeight;
if (tt.TranslateX > (right - shape.ActualWidth))
tt.TranslateX = right - shape.ActualWidth;
if (tt.TranslateX < left)
tt.TranslateX = left;
}
问题是,当平板电脑旋转时,我会缩放画布,如图所示。
void MainCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
double actualWidth = this.MainCanvas.ActualWidth / 1366;
double actualHeight = this.MainCanvas.ActualHeight / 768;
double min = Math.Min(actualWidth, actualHeight);
if (!this.istransformed && min == 1)
return;
this.istransformed = true;
var transform = MainCanvas.RenderTransform as CompositeTransform;
transform.ScaleX = min;
transform.ScaleY = min;
transform.CenterX = this.ActualWidth / 2;
transform.CenterY = this.ActualHeight / 2;
}
这同样有效,但有一点需要注意。在这种肖像模式/缩放画布中,形状只能在画布的一部分周围拖动。对ManipulationDelta的打断显示,尽管在视觉上进行了缩放,但形状本身仍然相信它们是原始的"高度"answers"宽度"。该形状的坐标也反映了未缩放的画布。例如,Circle会说它的X是1000,尽管它在屏幕上是可见的,并且当时画布的最大宽度只有786。
如何将刻度正确应用于动作翻译?
感谢
正如您已经预料到的,翻译将根据比例进行调整。假设你的体重秤是统一的。这是基本方法:
scale = 1;
distance = 500;
transform.ScaleX = transform.ScaleY = scale;
// actually moves 500
transform.TranslateX = distance / scale;
scale = 2;
distance = 500;
transform.ScaleX = transform.ScaleY = scale;
// actually moves 250
transform.TranslateX = distance / scale;
祝你好运!
您需要按当前比例因子的倒数缩放e.Delta.Translation.X
和e.Delta.Translation.Y
。在按比例缩小的视图中拖动(20,40)实际上是形状使用的坐标空间中的较大移动,即(40,80)。
你可能还想看看你的边界检查,我想不起来ActualWidth
和ActualHeight
是否是缩放值。