/*
         * HandlePanApply doesn't managed Recycled Views
         * Seems to work but not correctly
         *
         * The Idea would be at runtime(during animation)
         * To add old View to recycledList when they are far away(Math.Abs(translate) > maxTranslate)
         * And recycle a view and display it at the other side.
         * And give at this new display view the end of the animatiom(just the end :))
         */
        public void HandlePanApply(IAbsoluteList <View> displayedViews, double dragX, CoverItemPosition position, List <View> recycledViews)
        {
            Animation a = new Animation();

            var maxTranslate = CoverFlow.MaxGraphicAxis + CoverFlow.MarginBorder;

            foreach (var v in displayedViews)
            {
                var translate = v.TranslationX + dragX;
                if (Math.Abs(translate) > maxTranslate &&
                    displayedViews.Count() > 1)
                {
                    var diff = Math.Abs(translate) - maxTranslate;
                    var coef = 1 - diff / Math.Abs(dragX);
                    a.Add(0, 1, new Animation(f => v.TranslationX = f, v.TranslationX, translate, Easing.SinOut, () =>
                    {
                        /* Unworking code here but have to be done
                         * if (direction == AnimationDirection.Prev) // Movement --> right
                         *  CoverFlow.ItemMaxOnAxis = CoverFlow.VerifyIndex(CoverFlow.ItemMaxOnAxis - 1);
                         * else if (direction == AnimationDirection.Next)  // Movement <-- Left
                         *  CoverFlow.ItemMinOnAxis = CoverFlow.VerifyIndex(CoverFlow.ItemMinOnAxis + 1);
                         * v.IsVisible = false;
                         * recycledViews.Add(v);
                         *
                         *
                         * // Remove Views from displayed List
                         * CoverFlow.RemoveUnDisplayedViews();
                         *
                         * // RecyclerView
                         * var recycledView = CoverFlow.RecyclerView(direction);
                         *
                         * // Add animation at runtime
                         * a.Add((diff / dragX), 1, new Animation(f => v.TranslationX = f, v.TranslationX, translate, Easing.Linear, null));
                         */
                    }));
                }
                else
                {
                    a.Add(0, 1, new Animation(f => v.TranslationX = f, v.TranslationX, translate, Easing.SinOut, null));
                }
            }
            a.Commit(CoverFlow, "AlignViews", 60, 400, Easing.Linear, (double arg1, bool arg2) =>
            {
                // Console.WriteLine("Test");
            });
        }
        public void HandleInitViews(IAbsoluteList <View> displayedViews, CoverItemPosition viewPosition)
        {
            var PreviousItemtranslation = 0.0;
            var translate = (CoverFlow.Width / 2 - CoverFlow.MarginBorder) * (int)viewPosition;
            var count     = displayedViews.Count();

            foreach (var view in displayedViews)
            {
                if (translate > CoverFlow.Width / 2)
                {
                    var position = (count + displayedViews.IndexOf(view) - 1) * CoverFlow.Space;
                    translate = PreviousItemtranslation - position;
                }
                --count;
                view.TranslationX       = translate;
                PreviousItemtranslation = translate;
                translate = translate + CoverFlow.Space;
            }
        }
        public void HandlePanChanged(IAbsoluteList <View> displayedViews, double dragX, AnimationDirection direction, List <View> recycledViews)
        {
            var maxTranslate = CoverFlow.MaxGraphicAxis + CoverFlow.MarginBorder;

            foreach (var v in displayedViews)
            {
                var translate = v.TranslationX + dragX;
                if (Math.Abs(translate) > maxTranslate &&
                    displayedViews.Count() > 1)
                {
                    if (direction == AnimationDirection.Prev) // Movement --> right
                    {
                        CoverFlow.ItemMaxOnAxis = CoverFlow.VerifyIndex(CoverFlow.ItemMaxOnAxis - 1);
                    }
                    else if (direction == AnimationDirection.Next)  // Movement <-- Left
                    {
                        CoverFlow.ItemMinOnAxis = CoverFlow.VerifyIndex(CoverFlow.ItemMinOnAxis + 1);
                    }
                    recycledViews.Add(v);
                    v.IsVisible = false;
                }
                v.TranslationX = translate;
            }
        }