@@ -92,8 +92,8 @@ private void OnPaintCanvas(object sender, SKPaintSurfaceEventArgs e)
9292 }
9393
9494
95- double zoomCurScale = 1 ;
96- double zoomStartScale = 1 ;
95+ float zoomCurScale = 1 ;
96+ float zoomStartScale = 1 ;
9797
9898 SKPoint zoomStartOrigin = new SKPoint ( 0 , 0 ) ;
9999 SKPoint zoomStartOffset = new SKPoint ( 0 , 0 ) ;
@@ -115,45 +115,43 @@ void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
115115
116116 if ( e . Status == GestureStatus . Running )
117117 {
118+ float eScale = ( float ) e . Scale ;
119+ SKPoint eScaleOrigin = new SKPoint ( ( float ) e . ScaleOrigin . X , ( float ) e . ScaleOrigin . Y ) ;
120+ SKPoint canvasSize = new SKPoint ( CanvasSize . Width , CanvasSize . Height ) ;
121+
118122 // e.Scale is the delta to be applied for the current frame
119123 // Calculate the scale factor to be applied.
120- zoomCurScale += ( e . Scale - 1 ) * zoomStartScale ;
124+ zoomCurScale += ( eScale - 1 ) * zoomStartScale ;
121125 zoomCurScale = Math . Max ( 1 , zoomCurScale ) ;
122126 zoomCurScale = Math . Min ( 5 , zoomCurScale ) ;
123127
124-
125- SKPoint zoomPanDelta = new SKPoint ( ( float ) ( ( e . ScaleOrigin . X - zoomStartOrigin . X ) * CanvasSize . Width ) , ( float ) ( ( e . ScaleOrigin . Y - zoomStartOrigin . Y ) * CanvasSize . Height ) ) ;
128+ SKPoint zoomPanDelta = new SKPoint ( ( eScaleOrigin . X - zoomStartOrigin . X ) * CanvasSize . Width , ( eScaleOrigin . Y - zoomStartOrigin . Y ) * CanvasSize . Height ) ;
126129
127130 // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
128131 // so get the X pixel coordinate.
129- double renderedX = X + zoomStartOffset . X ;
130- double deltaX = renderedX / CanvasSize . Width ;
131- double deltaWidth = CanvasSize . Width / ( CanvasSize . Width * zoomStartScale ) ;
132- double originX = ( e . ScaleOrigin . X - deltaX ) * deltaWidth ;
132+ float renderedX = ( float ) X + zoomStartOffset . X ;
133+ float deltaX = renderedX / CanvasSize . Width ;
134+ float deltaWidth = CanvasSize . Width / ( CanvasSize . Width * zoomStartScale ) ;
135+ float originX = ( eScaleOrigin . X - deltaX ) * deltaWidth ;
133136
134137 //Console.WriteLine("ScaleOrigin: {0}, {1}", e.ScaleOrigin.X, e.ScaleOrigin.Y);
135138
136139 // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
137140 // so get the Y pixel coordinate.
138- double renderedY = Y + zoomStartOffset . Y ;
139- double deltaY = renderedY / CanvasSize . Height ;
140- double deltaHeight = CanvasSize . Height / ( CanvasSize . Height * zoomStartScale ) ;
141- double originY = ( e . ScaleOrigin . Y - deltaY ) * deltaHeight ;
141+ float renderedY = ( float ) Y + zoomStartOffset . Y ;
142+ float deltaY = renderedY / CanvasSize . Height ;
143+ float deltaHeight = CanvasSize . Height / ( CanvasSize . Height * zoomStartScale ) ;
144+ float originY = ( eScaleOrigin . Y - deltaY ) * deltaHeight ;
142145
143146 // Calculate the transformed element pixel coordinates.
144- double targetX = zoomStartOffset . X - ( originX * CanvasSize . Width ) * ( zoomCurScale - zoomStartScale ) ;
145- double targetY = zoomStartOffset . Y - ( originY * CanvasSize . Height ) * ( zoomCurScale - zoomStartScale ) ;
146-
147- // Apply translation based on the change in origin.
148- zoomTranslation . X = ( float ) targetX ;
149- zoomTranslation . Y = ( float ) targetY ;
150-
147+ zoomTranslation . X = zoomStartOffset . X - ( originX * CanvasSize . Width ) * ( zoomCurScale - zoomStartScale ) ;
148+ zoomTranslation . Y = zoomStartOffset . Y - ( originY * CanvasSize . Height ) * ( zoomCurScale - zoomStartScale ) ;
151149
150+ // Calculate final translation with pan, and clamp the whole thing
152151 SKPoint final = zoomTranslation + zoomPanDelta ;
153- final . X = Math . Min ( Math . Max ( final . X , - CanvasSize . Width * ( float ) ( zoomCurScale - 1 ) ) , 0 ) ;
154- final . Y = Math . Min ( Math . Max ( final . Y , - CanvasSize . Height * ( float ) ( zoomCurScale - 1 ) ) , 0 ) ;
152+ final . X = Math . Min ( Math . Max ( final . X , - CanvasSize . Width * ( zoomCurScale - 1 ) ) , 0 ) ;
153+ final . Y = Math . Min ( Math . Max ( final . Y , - CanvasSize . Height * ( zoomCurScale - 1 ) ) , 0 ) ;
155154
156-
157155 axisChart . XForm . Scale = ( float ) zoomCurScale ;
158156 axisChart . XForm . Offset = final ;
159157 InvalidateSurface ( ) ;
0 commit comments