Пример #1
0
        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);
            }
        }
Пример #2
0
        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;
            }
        }