/// <summary> /// /// </summary> /// <returns>当动画已结束,返回<code>true</code></returns> public virtual bool RefreshLayout() { if (animator == null) { return(true); } double stamp = animator.NowStamp(); double leftTime = 1 - stamp; bool noRefresh = Math.Abs(stamp - 1) < 0.001; this.Invoke((EventHandler) delegate { Left = (int)(TargetPos.X * stamp + PreviousPos.X * leftTime); Top = (int)(TargetPos.Y * stamp + PreviousPos.Y * leftTime); Width = (int)(TargetPos.Width * stamp + PreviousPos.Width * leftTime); Height = (int)(TargetPos.Height * stamp + PreviousPos.Height * leftTime); BackColor = Color.FromArgb( (int)(TargetColor.A * stamp + PreviousColor.A * leftTime), (int)(TargetColor.R * stamp + PreviousColor.R * leftTime), (int)(TargetColor.G * stamp + PreviousColor.G * leftTime), (int)(TargetColor.B * stamp + PreviousColor.B * leftTime) ); }); Invalidate(); if (noRefresh) { animator = null; } return(noRefresh); }
public virtual void Animate(int interval, int delay, RectangleF target, Color bckColorTarget) { PreviousPos = this.Bounds; PreviousColor = this.BackColor; TargetPos = target; TargetColor = bckColorTarget; animator = new AnimationStamp(interval, delay); Program.AnimationOn = true; }