Inheritance: EasingFunctionBase, IQuarticEase
        /// <summary>
        /// 更新所有子项位置
        /// </summary>
        private void GotoPreOrNext(bool toNext)
        {
            if (_storyboard != null && !_isStoryboardCompleted)
            {
                _storyboard?.Stop();
                ResetPosition();
            }

            _isStoryboardCompleted = false;
            var img0 = GetItemByTag(0);
            var img1 = GetItemByTag(1);
            var img2 = GetItemByTag(2);
            var img3 = GetItemByTag(3);

            var center = CanvasContainer.ActualWidth / 2;
            var duration = 600;
            var beginTime = 60;
            _storyboard = new Storyboard();
            var ease = new QuarticEase() { EasingMode = EasingMode.EaseOut };

            ViewerItem target0, target2;
            if (toNext)
            {
                target0 = img0;
                target2 = img2;
            }
            else
            {
                target0 = img2;
                target2 = img0;
            }

            // img0
            StoryboardHelper.CreatAnimation(target0, _storyboard, "UIElement.Opacity", 110, 0, 0, null, false);

            // img1
            var tanslateX = img1.ActualWidth * SIDE_DISTANCE_RATIO;

            double toValue = toNext ? -tanslateX : tanslateX;
            StoryboardHelper.CreatAnimation(img1.RenderTransform, _storyboard, "(CompositeTransform.TranslateX)", duration, 0, toValue, ease, false);
            StoryboardHelper.CreatAnimation(img1.RenderTransform, _storyboard, "(CompositeTransform.ScaleX)", duration, 0, SCALE_RATIO, ease, false);
            StoryboardHelper.CreatAnimation(img1.RenderTransform, _storyboard, "(CompositeTransform.ScaleY)", duration, 0, SCALE_RATIO, ease, false);

            // img2
            StoryboardHelper.CreatAnimation(target2.RenderTransform, _storyboard, "(CompositeTransform.TranslateX)", duration, beginTime, toValue, ease, false);
            StoryboardHelper.CreatAnimation(target2.RenderTransform, _storyboard, "(CompositeTransform.ScaleX)", duration, 0, 1, ease, false);
            StoryboardHelper.CreatAnimation(target2.RenderTransform, _storyboard, "(CompositeTransform.ScaleY)", duration, 0, 1, ease, false);

            // img3
            Canvas.SetLeft(img3, center - img3.ActualWidth / 2 + img3.ActualWidth * SIDE_DISTANCE_RATIO);
            var item = GetNextOrPreItem(target2, toNext);
            if (img3.DataContext != item)
            {
                img3.DataContext = item;
            }
            Canvas.SetLeft(img3, Canvas.GetLeft(target2));
            var trans = img3.RenderTransform as CompositeTransform;
            trans.ScaleX = SCALE_RATIO;
            trans.ScaleY = SCALE_RATIO;
            StoryboardHelper.CreatAnimation(img3, _storyboard, "UIElement.Opacity", duration, 0, 1, null, false);

            // zindex
            ObjectAnimationUsingKeyFrames oa1 = new ObjectAnimationUsingKeyFrames() {BeginTime = TimeSpan.FromMilliseconds(0)};
            oa1.KeyFrames.Add(new DiscreteObjectKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 0 });
            Storyboard.SetTargetProperty(oa1, "(Canvas.ZIndex)");
            Storyboard.SetTarget(oa1, img1);

            ObjectAnimationUsingKeyFrames oa2 = new ObjectAnimationUsingKeyFrames() {BeginTime = TimeSpan.FromMilliseconds(0)};
            oa2.KeyFrames.Add(new DiscreteObjectKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 1 });
            Storyboard.SetTargetProperty(oa2, "(Canvas.ZIndex)");
            Storyboard.SetTarget(oa2, target2);

            _storyboard.Children.Add(oa1);
            _storyboard.Children.Add(oa2);

            target0.ShowMask(true);
            target2.ShowMask(false);
            img1.ShowMask(true);
            img3.ShowMask(true);

            UpdateTag(toNext);
            _storyboard.Begin();
            _storyboard.Completed += (e1, e2) =>
            {
                _isStoryboardCompleted = true;
                ResetPosition();
            };

        }
        /// <summary>
        /// 更新所有子项位置
        /// </summary>
        private void GotoPreOrNext(bool toNext)
        {
            var img0 = GetItemByTag(0);
            var img1 = GetItemByTag(1);
            var img2 = GetItemByTag(2);
            var img3 = GetItemByTag(3);

            var center = CanvasContainer.ActualWidth / 2;
            var duration = 600;
            var beginTime = 80;
            Storyboard storyboard = new Storyboard();
            var ease = new QuarticEase(){EasingMode = EasingMode.EaseOut};

            // img0
            StoryboardHelper.CreatAnimation(img0, storyboard, "UIElement.Opacity", duration, 0, 0, null, false);

            // img1
            var tanslateX = img1.ActualWidth * SIDE_DISTANCE_RATIO;

            double toValue = toNext ? -tanslateX : tanslateX;
            StoryboardHelper.CreatAnimation(img1.RenderTransform, storyboard, "(CompositeTransform.TranslateX)", duration, 0, toValue, ease, false);
            StoryboardHelper.CreatAnimation(img1.RenderTransform, storyboard, "(CompositeTransform.ScaleX)", duration, 0, SCALE_RATIO, ease, false);
            StoryboardHelper.CreatAnimation(img1.RenderTransform, storyboard, "(CompositeTransform.ScaleY)", duration, 0, SCALE_RATIO, ease, false);

            // img2
            StoryboardHelper.CreatAnimation(img2.RenderTransform, storyboard, "(CompositeTransform.TranslateX)", duration, beginTime, toValue, ease, false);
            StoryboardHelper.CreatAnimation(img2.RenderTransform, storyboard, "(CompositeTransform.ScaleX)", duration, 0, 1, ease, false);
            StoryboardHelper.CreatAnimation(img2.RenderTransform, storyboard, "(CompositeTransform.ScaleY)", duration, 0, 1, ease, false);

            // img3
            Canvas.SetLeft(img3, center - img3.ActualWidth / 2 + img3.ActualWidth * SIDE_DISTANCE_RATIO);
            var item = GetNextOrPreItem(img2, toNext);
            if (img3.DataContext != item)
            {
                img3.DataContext = item;
            }
            var trans = img3.RenderTransform as CompositeTransform;
            trans.ScaleX = SCALE_RATIO;
            trans.ScaleY = SCALE_RATIO;
            StoryboardHelper.CreatAnimation(img3, storyboard, "UIElement.Opacity", duration, 0, 1, null, false);

            // zindex
            ObjectAnimationUsingKeyFrames oa1 = new ObjectAnimationUsingKeyFrames();
            oa1.KeyFrames.Add(new DiscreteObjectKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 0 });
            Storyboard.SetTargetProperty(oa1,"(Canvas.ZIndex)");
            Storyboard.SetTarget(oa1,img1);

            ObjectAnimationUsingKeyFrames oa2 = new ObjectAnimationUsingKeyFrames();
            oa2.KeyFrames.Add(new DiscreteObjectKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 1 });
            Storyboard.SetTargetProperty(oa2, "(Canvas.ZIndex)");
            Storyboard.SetTarget(oa2, img2);

            storyboard.Children.Add(oa1);
            storyboard.Children.Add(oa2);


            storyboard.Begin();
            storyboard.Completed += (e1, e2) =>
            {
                Debug.WriteLine("Completed");
                UpdateTag(toNext);
                ResetPosition();
            };
        }
Example #3
0
 //Get Easing Function
 private EasingFunctionBase GetEasingFunction(Easing type)
 {
     EasingFunctionBase func = null;
     switch (type)
     {
         case Easing.EaseSineIn:
         case Easing.EaseSineOut:
         case Easing.EaseSineInOut:
             func = new SineEase();
             break;
         case Easing.EaseCircleIn:
         case Easing.EaseCircleOut:
         case Easing.EaseCircleInOut:
             func = new CircleEase();
             break;
         case Easing.EaseQuadraticIn:
         case Easing.EaseQuadraticOut:
         case Easing.EaseQuadraticInOut:
             func = new QuadraticEase();
             break;
         case Easing.EaseCubicIn:
         case Easing.EaseCubicOut:
         case Easing.EaseCubicInOut:
             func = new CubicEase();
             break;
         case Easing.EaseQuarticIn:
         case Easing.EaseQuarticOut:
         case Easing.EaseQuarticInOut:
             func = new QuarticEase();
             break;
         case Easing.EaseQuinticIn:
         case Easing.EaseQuinticOut:
         case Easing.EaseQuinticInOut:
             func = new QuinticEase();
             break;
         case Easing.EaseBackIn:
         case Easing.EaseBackOut:
         case Easing.EaseBackInOut:
             func = new BackEase();
             break;
         case Easing.EaseBounceIn:
         case Easing.EaseBounceOut:
         case Easing.EaseBounceInOut:
             func = new BounceEase();
             break;
         case Easing.EaseElasticIn:
         case Easing.EaseElasticOut:
         case Easing.EaseElasticInOut:
             func = new ElasticEase();
             break;
         case Easing.EaseExpoIn:
         case Easing.EaseExpoOut:
         case Easing.EaseExpoInOut:
             func = new ExponentialEase();
             break;
         case Easing.EasePowerIn:
         case Easing.EasePowerOut:
         case Easing.EasePowerInOut:
             func = new PowerEase();
             break;
         default:
             break;
     }
     if (func != null)
     {
         switch ((int)type % 3)
         {
             case 0:
                 func.EasingMode = EasingMode.EaseIn;
                 break;
             case 1:
                 func.EasingMode = EasingMode.EaseOut;
                 break;
             default:
                 func.EasingMode = EasingMode.EaseInOut;
                 break;
         }
     }
     return func;
 }