public void Fling(float velocityX, float velocityY) { CancelAnimation(); ViewChanging?.Invoke(this, new EventArgs()); // Velocity is pixels per second, but it comes in extremely powerful, so we'll downgrade it some velocityX = SanitizeFlingVelocity(velocityX); velocityY = SanitizeFlingVelocity(velocityY); if (velocityX == 0 && velocityY == 0) { return; } float calculatedHorizontalOffset = HorizontalOffset - velocityX; float calculatedVerticalOffset = VerticalOffset - velocityY; float safeHorizontalOffset = SanitizeHorizontalOffset(calculatedHorizontalOffset); float safeVerticalOffset = SanitizeVerticalOffset(calculatedVerticalOffset); float calculatedTranslationX = CalculateTranslationX(calculatedHorizontalOffset); float calculatedTranslationY = CalculateTranslationY(calculatedVerticalOffset); float safeTranslationX = CalculateTranslationX(safeHorizontalOffset); float safeTranslationY = CalculateTranslationY(safeVerticalOffset); for (int i = 0; i < base.ChildCount; i++) { var view = GetChildAt(i); var animator = ObjectAnimator.OfFloat(view, "translationX", calculatedTranslationX); animator.SetDuration(1000); animator.SetInterpolator(new MyInterpolator(animator, view.TranslationX, calculatedTranslationX, safeTranslationX)); animator.AnimationCancel += (s, e) => { view.TranslationX = (float)(s as ObjectAnimator).AnimatedValue; }; animator.AnimationEnd += (s, e) => { view.TranslationX = (float)(s as ObjectAnimator).AnimatedValue; }; animator.Start(); _currentAnimators.Add(animator); animator = ObjectAnimator.OfFloat(view, "translationY", calculatedTranslationY); animator.SetDuration(1000); animator.SetInterpolator(new MyInterpolator(animator, view.TranslationY, calculatedTranslationY, safeTranslationY)); animator.AnimationCancel += (s, e) => { view.TranslationY = (float)(s as ObjectAnimator).AnimatedValue; }; animator.AnimationEnd += (s, e) => { view.TranslationY = (float)(s as ObjectAnimator).AnimatedValue; }; animator.Start(); _currentAnimators.Add(animator); } }
public void ChangeView(float?horizontalOffset, float?verticalOffset, float?zoomFactor) { CancelAnimation(); ViewChanging?.Invoke(this, new EventArgs()); if (zoomFactor != null) { ZoomFactor = Math.Max(MinZoomFactor, Math.Min(MaxZoomFactor, zoomFactor.Value)); } float finalHorizontalOffset = HorizontalOffset; if (horizontalOffset != null) { finalHorizontalOffset = horizontalOffset.Value; } finalHorizontalOffset = SanitizeHorizontalOffset(finalHorizontalOffset); float finalVerticalOffset = VerticalOffset; if (verticalOffset != null) { finalVerticalOffset = verticalOffset.Value; } finalVerticalOffset = SanitizeVerticalOffset(finalVerticalOffset); for (int i = 0; i < base.ChildCount; i++) { var view = GetChildAt(i); view.TranslationX = CalculateTranslationX(finalHorizontalOffset); view.TranslationY = CalculateTranslationY(finalVerticalOffset); view.ScaleX = ZoomFactor; view.ScaleY = ZoomFactor; } }