Xamarin Forms Prise und Pfanne zusammen

Ich habe sowohl Pan als auch Pinch einzeln implementiert und es funktioniert einwandfrei. Ich versuche jetzt, Prise und Pfanne zusammen zu verwenden und sehe einige Probleme. Hier ist mein Code:

XAML:

<AbsoluteLayout x:Name="PinchZoomContainer">
  <controls:NavBar x:Name="NavBar" ShowPrevNext="true" ShowMenu="false" IsModal="true" />
  <controls:PanContainer  x:Name="PinchToZoomContainer">
    <Image x:Name="ImageMain" />
  </controls:PanContainer>
</AbsoluteLayout>

Pinch / Pan Gesture Add's:

var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += OnPanUpdated;
GestureRecognizers.Add(panGesture);

var pinchGesture = new PinchGestureRecognizer();
pinchGesture.PinchUpdated += OnPinchUpdated;
GestureRecognizers.Add(pinchGesture);

Pan-Methode:

void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
    switch (e.StatusType)
    {
        case GestureStatus.Started:
            startX = e.TotalX;
            startY = e.TotalY;
            Content.AnchorX = 0;
            Content.AnchorY = 0;

            break;
        case GestureStatus.Running:
            // Translate and ensure we don't pan beyond the wrapped user interface element bounds.
            Content.TranslationX = Math.Max(Math.Min(0, x + e.TotalX), -Math.Abs(Content.Width - App.ScreenWidth));
            Content.TranslationY = Math.Max(Math.Min(0, y + e.TotalY), -Math.Abs(Content.Height - App.ScreenHeight));
            break;

        case GestureStatus.Completed:
            // Store the translation applied during the pan
            x = Content.TranslationX;
            y = Content.TranslationY;
            break;
    }
}

Pinch-Methode:

void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
{
    if (e.Status == GestureStatus.Started)
    {
        // Store the current scale factor applied to the wrapped user interface element,
        // and zero the components for the center point of the translate transform.
        startScale = Content.Scale;
        //ImageMain.AnchorX = 0;
        //ImageMain.AnchorY = 0;
    }
    if (e.Status == GestureStatus.Running)
    {
        // Calculate the scale factor to be applied.
        currentScale += (e.Scale - 1) * startScale;
        currentScale = Math.Max(1, currentScale);
        currentScale = Math.Min(currentScale, 2.5);
        // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
        // so get the X pixel coordinate.
        double renderedX = Content.X + xOffset;
        double deltaX = renderedX / Width;
        double deltaWidth = Width / (Content.Width * startScale);
        double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;

        // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
        // so get the Y pixel coordinate.
        double renderedY = Content.Y + yOffset;
        double deltaY = renderedY / Height;
        double deltaHeight = Height / (Content.Height * startScale);
        double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;

        // Calculate the transformed element pixel coordinates.
        double targetX = xOffset - (originX * Content.Width) * (currentScale - startScale);
        double targetY = yOffset - (originY * Content.Height) * (currentScale - startScale);

        // Apply translation based on the change in origin.
        Content.TranslationX = targetX.Clamp(-Content.Width * (currentScale - 1), 0);
        Content.TranslationY = targetY.Clamp(-Content.Height * (currentScale - 1), 0);

        // Apply scale factor
        Content.Scale = currentScale;
    }
    if (e.Status == GestureStatus.Completed)
    {
        // Store the translation delta's of the wrapped user interface element.
        xOffset = Content.TranslationX;
        yOffset = Content.TranslationY;
    }
}

Wenn ich eine der beiden Gesten ausschalte und nur die andere benutze, funktioniert die Funktionalität einwandfrei. Das Problem tritt auf, wenn ich die Schwenk- UND Kneifgesten hinzufüge. Was zu passieren scheint, ist folgendes:

1) Das Schwenken scheint tatsächlich wie erwartet zu funktionieren. 2) Wenn Sie das Bild anfangs schwenken, verschieben Sie das Bild beispielsweise in die Y-Mitte und in die X-Mitte, und versuchen Sie dann zu zoomen, wird das Bild zurückgesetzt Es ist der Ausgangszustand. Wenn Sie dann schwenken, werden Sie wieder dorthin versetzt, wo Sie sich befanden, bevor Sie versucht haben zu zoomen (weshalb ich sage, dass das Schwenken einwandfrei funktioniert).

Nach meinem Verständnis beim Debuggen wird beim Zoomen nicht die Position berücksichtigt, an der Sie sich gerade befinden. Wenn Sie also zuerst schwenken und dann zoomen, wird nicht die Position vergrößert, an der Sie sich befinden, sondern der Anfangspunkt des Bildes. Wenn Sie dann versuchen, von dort aus zu schwenken, merkt sich die Schwenkmethode immer noch, wo Sie sich befanden, und sie verschiebt Sie zurück an den Ort, an dem Sie sich befanden, bevor Sie versucht haben zu zoomen.

Hopping einige Einblicke in diese. Offensichtlich gibt es ein Problem mit meiner Pinch-Methode. Ich denke nur (offensichtlich kann ich nicht herausfinden), dass ich Logik hinzufügen muss, die berücksichtigt, wo Sie sich gerade befinden.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage