使用 ManipulationDelta 事件 UWP 旋转边框

Rotating a border with ManipulationDelta Event UWP

我想惯性旋转边框。我应该在哪里遗漏一些东西?

MainPage.xaml:

<Grid>
    <Border x:Name="ManipulationBorder" Width="200" Height="200" HorizontalAlignment="Center" VerticalAlignment="Center" Background="Red"/>
</Grid>

MainPage.xaml.cs:

private TransformGroup transforms;
private MatrixTransform previousTransform;
private CompositeTransform deltaTransform;

public MainPage()
{
    this.InitializeComponent();

    InitManipulationTransforms();

    ManipulationBorder.ManipulationDelta += new ManipulationDeltaEventHandler(ManipulateMe_ManipulationDelta);

    ManipulationBorder.ManipulationMode =
        ManipulationModes.TranslateX |
        ManipulationModes.TranslateY |
        ManipulationModes.Rotate |
        ManipulationModes.TranslateInertia |
        ManipulationModes.RotateInertia;
}

private void InitManipulationTransforms()
{
    transforms = new TransformGroup();
    previousTransform = new MatrixTransform() { Matrix = Matrix.Identity };
    deltaTransform = new CompositeTransform();

    transforms.Children.Add(previousTransform);
    transforms.Children.Add(deltaTransform);

    ManipulationBorder.RenderTransform = transforms;
}

private void ManipulateMe_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    previousTransform.Matrix = transforms.Value;

    // Center point for rotation
    Point center = previousTransform.TransformPoint(new Point(e.Position.X, e.Position.Y));
    deltaTransform.CenterX = center.X;
    deltaTransform.CenterY = center.Y;

    // Rotation
    deltaTransform.Rotation = e.Delta.Rotation;
}

当我实际去应用 ManipulationDeltaRoutedEventArgs 中的增量旋转时,它不起作用。我哪里错了?

提前致谢。

When I actually go to apply delta rotation in ManipulationDeltaRoutedEventArgs it does not work. Where am I wrong?

标准的基于触摸的旋转需要两个或更多触摸点:

对于单点触摸旋转,您需要先固定deltaTransform 的中心。 您需要重新计算 Angle 已通过单击更改。

你会知道Angle = a1 - a2的价值。

private void Right_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{

    var x = this.RightRotateTransform.CenterX - e.Position.X;
    var y = this.RightRotateTransform.CenterY - e.Position.Y;

    double a1 = Math.Atan(y / x);
    double a2 = Math.Atan((e.Delta.Translation.Y - y) / (x - e.Delta.Translation.X));

    this.RightRotateTransform.Angle += a1 - a2;
}