Hello,
Welcome to our Microsoft Q&A platform!
- I create a basic demo to test the function, it works well on both Android 10 and 11. I tested the code with Xamarin.Forms 5. Please update the packages of both the shared project and the native project to the lastest stable version, then test again.
- To show a zoomable image, you cuold create a 'pin-to-zoom' container to wrap the image. Check the code: public class PinchToZoomContainer : ContentView
{
double currentScale = 1;
double startScale = 1;
double xOffset = 0;
double yOffset = 0;
}public PinchToZoomContainer() { var pinchGesture = new PinchGestureRecognizer(); pinchGesture.PinchUpdated += OnPinchUpdated; GestureRecognizers.Add(pinchGesture); } 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; Content.AnchorX = 0; Content.AnchorY = 0; } if (e.Status == GestureStatus.Running) { // Calculate the scale factor to be applied. currentScale += (e.Scale - 1) * startScale; currentScale = Math.Max(1, currentScale); // 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; } }
Display the image in the container.
<StackLayout>
<local:PinchToZoomContainer>
<local:PinchToZoomContainer.Content>
<Image Source="one.png" HeightRequest="55"/>
</local:PinchToZoomContainer.Content>
</local:PinchToZoomContainer>
</StackLayout>
Related link:
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/gestures/pinch#creating-a-pinchtozoom-container
Best Regards,
Jarvan Zhang
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.