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); })); }
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); }
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(); }); }
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); }