예제 #1
0
        void GetGoAnimationBackground(object obj)
        {
            AnimationThread    paramater   = (AnimationThread)obj;
            Rect               bound       = (Rect)(paramater.Paramaters[0]);
            Rect               screenBound = (Rect)(paramater.Paramaters[1]);
            ATowardto          toward      = (ATowardto)(paramater.Paramaters[2]);
            bool               stopInBound = (bool)(paramater.Paramaters[3]);
            List <AnimationTo> jumps       = this.GetGo(bound, screenBound, toward, stopInBound);

            Application.Current.Dispatcher.BeginInvoke((Action)(() =>
            {
                paramater.CompletedEvent(jumps);
            }));
        }
예제 #2
0
        public void GetGoAnimationSync(Rect bound, Rect screenBound, ATowardto toward, bool stopInBound, Action <List <AnimationTo> > completedEvent)
        {
            AnimationThread obj = new AnimationThread();

            obj.Paramaters.Add(bound);
            obj.Paramaters.Add(screenBound);
            obj.Paramaters.Add(toward);
            obj.Paramaters.Add(stopInBound);
            obj.CompletedEvent = completedEvent;

            Thread thread = new Thread(new ParameterizedThreadStart(this.GetGoAnimationBackground));

            thread.IsBackground = true;
            thread.Name         = "GoAnimation";
            thread.Start(obj);
        }
예제 #3
0
        void GoAnimation(StrokeCollection strokes, ATowardto atoward)
        {
            Rect  bound       = strokes.GetBounds();
            Rect  screenBound = new Rect(0, 0, this.ActualWidth, this.ActualHeight);
            Point from        = new Point(bound.Left + bound.Width / 2, bound.Top + bound.Height / 2);

            AnimationLibrary.Current.GetGoAnimationSync(bound, screenBound, atoward, false, (position) =>
            {
                AnimationObj ani1 = AnimationEngine.AddDurationActionAnimation(strokes, AnimationActionType.Translate, center, (int)position[0].Duration, from, position[0].To);
                AnimationObj ani2 = AnimationEngine.AddDurationActionAnimation(strokes, AnimationActionType.Translate, center, (int)position[2].Duration, position[1].To, position[2].To);


                ani1.AnimationCompleted += (sender, ex) =>
                {
                    Matrix maritx  = new Matrix();
                    double tChange = 0;
                    switch (atoward)
                    {
                    case ATowardto.ToLeft:
                    case ATowardto.ToRight:
                        tChange = position[1].To.X - position[0].To.X;
                        maritx.Translate(tChange, 0);
                        break;

                    case ATowardto.ToTop:
                    case ATowardto.ToBottom:
                        tChange = position[1].To.Y - position[0].To.Y;
                        maritx.Translate(0, tChange);
                        break;

                    default:
                        break;
                    }

                    strokes.Transform(maritx, false);
                    ani2.Begin();
                };

                ani2.AnimationCompleted += (sender, ex) =>
                {
                    Matrix maritx  = new Matrix();
                    double tChange = 0;
                    switch (atoward)
                    {
                    case ATowardto.ToLeft:
                    case ATowardto.ToRight:
                        tChange = position[1].To.X - position[0].To.X;
                        maritx.Translate(tChange, 0);
                        break;

                    case ATowardto.ToTop:
                    case ATowardto.ToBottom:
                        tChange = position[1].To.Y - position[0].To.Y;
                        maritx.Translate(0, tChange);
                        break;

                    default:
                        break;
                    }

                    strokes.Transform(maritx, false);
                    ani2.Begin();
                };

                ani1.Begin();
            });
        }
예제 #4
0
        List <AnimationTo> GetGo(Rect bound, Rect screenBound, ATowardto toward, bool stopInBound)
        {
            List <AnimationTo> result = new List <AnimationTo>();
            Point  from     = this.GetCenter(bound);
            double duration = rand.NextDouble() * 5 + 5;

            Point target1 = new Point();

            switch (toward)
            {
            case ATowardto.ToTop:
                target1.Y = stopInBound ? bound.Height / 2 : 0 - bound.Height / 2;
                target1.X = from.X;
                break;

            case ATowardto.ToBottom:
                target1.Y = stopInBound ? screenBound.Height - bound.Height / 2 : 0 - bound.Height / 2;
                target1.X = from.X;
                break;

            case ATowardto.ToLeft:
                target1.X = stopInBound ? bound.Width / 2 : 0 - bound.Width / 2;
                target1.Y = from.Y;
                break;

            case ATowardto.ToRight:
                target1.X = stopInBound ? screenBound.Width - bound.Width / 2 : screenBound.Width + bound.Width / 2;
                target1.Y = from.Y;
                break;

            default:
                break;
            }

            AnimationTo at1 = new AnimationTo(duration, target1);

            result.Add(at1);


            if (stopInBound == false)
            {
                double change1 = 0;
                double change2 = 0;

                Point target2 = new Point();

                switch (toward)
                {
                case ATowardto.ToTop:
                    target2.Y = screenBound.Height + bound.Height / 2;
                    target2.X = from.X;
                    change1   = target1.Y - from.Y;
                    change2   = target2.Y - target1.Y;
                    break;

                case ATowardto.ToBottom:
                    target2.Y = 0 - bound.Height / 2;
                    target2.X = from.X;
                    change1   = target1.Y - from.Y;
                    change2   = target2.Y - target1.Y;
                    break;

                case ATowardto.ToLeft:
                    target2.X = screenBound.Width + bound.Width / 2;
                    target2.Y = from.Y;
                    change1   = target1.X - from.X;
                    change2   = target2.X - target1.X;
                    break;

                case ATowardto.ToRight:
                    target2.X = 0 - bound.Width / 2;
                    target2.Y = from.Y;
                    change1   = target1.X - from.X;
                    change2   = target2.X - target1.X;
                    break;

                default:
                    break;
                }

                double      dur2 = duration * change2 / change1;
                AnimationTo at2  = new AnimationTo(dur2, target2);
                result.Add(at2);
                result.Add(at1);
            }

            return(result);
        }