0

我已经为一个问题苦苦挣扎了好几天了。我相信我很接近,但解决方案一直在逃避我。

我有一个画布,可以在上面动态放置不同的形状。使用 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 表明,尽管在视觉上进行了缩放,但形状本身仍然相信它们是它们的原始高度和宽度。该形状的坐标也反映了未缩放的画布。例如,一个 Circle 会说它的 X 是 1000,即使它在屏幕上可见并且当时的最大画布宽度仅为 786。

如何将比例正确应用于我的运动翻译?

谢谢

4

2 回答 2

1

正如您已经预料到的那样,翻译将按比例调整。假设您的比例是统一的。这是基本方法:

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;

祝你好运!

于 2013-08-22T05:03:21.207 回答
0

您需要按当前比例因子e.Delta.Translation.Xe.Delta.Translation.Y倒数进行缩放。在按比例缩小的视图中将某些东西拖动 (20,40) 实际上是在您的形状使用的坐标空间中更大的移动,即 (40,80)。

您可能还想看看您的边界检查,我不记得我的头顶是否ActualWidthActualHeight缩放值。

于 2013-08-21T16:37:41.483 回答