- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- namespace BjNiu
- {
- class Animator
- {
- Dictionary<Object, List<AnimJob>> objects;
- Timer tmrAnim = new Timer();
- private int fps;
- public int FPS
- {
- get
- {
- return fps;
- }
- set
- {
- fps = value;
- tmrAnim.Interval = 1000 / fps;
- }
- }
- private class AnimJob
- {
- public string Property;
- public Object Value;
- }
- public Animator()
- {
- objects = new Dictionary<object, List<AnimJob>>();
- tmrAnim.Interval = 25;
- tmrAnim.Enabled = true;
- tmrAnim.Tick += tmrAnim_Tick;
- }
- public Animator(int FPS)
- {
- objects = new Dictionary<object, List<AnimJob>>();
- tmrAnim.Interval = 25;
- tmrAnim.Enabled = true;
- tmrAnim.Tick += tmrAnim_Tick;
- this.FPS = FPS;
- }
- private int getStep(int thisValue, int desValue)
- {
- if (thisValue == desValue) return 0;
- int step = (desValue - thisValue) / 3;
- if (step == 0)
- {
- if (desValue > thisValue) step = 1;
- else step = -1;
- }
- return step;
- }
- private double convertStepToPersent(int intStep)
- {
- double step = (double)intStep / 100;
- if (Math.Abs(step) < 0.01)
- {
- if (intStep > 0) step = 0.01;
- else step = -0.01;
- }
- return step;
- }
- void tmrAnim_Tick(object sender, EventArgs e)
- {
- foreach (KeyValuePair<object, List<AnimJob>> item in objects)
- {
- if (item.Key is Control)
- {
- Control control = (Control)item.Key;
- List<AnimJob> jobs = item.Value;
- foreach (AnimJob job in jobs)
- {
- switch (job.Property.ToLower())
- {
- case "left":
- int step = getStep(control.Left, (int)job.Value);
- if (step == 0) { jobs.Remove(job); return; }
- control.Left += step;
- break;
- case "top":
- step = getStep(control.Top, (int)job.Value);
- if (step == 0) { jobs.Remove(job); return; }
- control.Top += step;
- break;
- case "width":
- step = getStep(control.Width, (int)job.Value);
- if (step == 0) { jobs.Remove(job); return; }
- control.Width += step;
- break;
- case "height":
- step = getStep(control.Height, (int)job.Value);
- if (step == 0) { jobs.Remove(job); return; }
- control.Height += step;
- break;
- case "backcolor":
- Color val = (Color)job.Value;
- int valR = val.R;
- int valG = val.G;
- int valB = val.B;
- int stepR = getStep(control.BackColor.R, valR);
- int stepG = getStep(control.BackColor.G, valG);
- int stepB = getStep(control.BackColor.B, valB);
- if (Math.Abs(stepR) + Math.Abs(stepG) + Math.Abs(stepB) == 0)
- {
- jobs.Remove(job); return;
- }
- Color backColor = Color.FromArgb(control.BackColor.R + stepR,
- control.BackColor.G + stepG, control.BackColor.B + stepB);
- control.BackColor = backColor;
- break;
- case "opacity":
- if (item.Key is Form)
- {
- Form form = (Form)control;
- step = getStep((int)(form.Opacity * 100), (int)(Convert.ToDouble(job.Value) * 100));
- if (step == 0) { jobs.Remove(job); return; }
- form.Opacity += convertStepToPersent(step);
- }
- else
- {
- jobs.Remove(job);
- MessageBox.Show("Control不支持透明度属性,只有Form支持。");
- return;
- }
- break;
- default:
- jobs.Remove(job);
- MessageBox.Show("Control不支持[" + job.Property + "]属性。");
- return;
- }
- }
- }
- else
- {
- //其他非Control如BjButton
- }
- }
- }
- public void Set(Object obj, string prop, Object value)
- {
- if (!objects.ContainsKey(obj))
- {
- List<AnimJob> jobs = new List<AnimJob>();
- objects.Add(obj, jobs);
- }
- AnimJob job = new AnimJob();
- job.Property = prop;
- job.Value = value;
- //判断是否已经有了这个属性,可以避免用户连续多次执行某个动画
- if (!updateExistProperty(objects[obj], job)) objects[obj].Add(job);
- }
- private bool updateExistProperty(List<AnimJob> jobs, AnimJob aJob)
- {
- bool have = false;
- foreach (AnimJob job in jobs)
- {
- if (job.Property == aJob.Property)
- {
- have = true;
- job.Value = aJob.Value;
- break;
- }
- }
- return have;
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/2310201513879.html
来源: http://www.codesnippet.cn/detail/2310201513879.html