Я пытался плавно анимировать некоторые местоположения Windows Form, но у меня возникают некоторые проблемы, если я хочу, чтобы скорость была переменной. Другими словами, если я хочу разрешить пользователю выбирать предпочтительную скорость для анимации.
Я нашел следующую статью, которая очень помогла мне выполнить анимацию, которую я искал, для моей формы. Кажется, это лучше во всех отношениях, чем подход BackgroundWorker или Threads, который я пробовал в прошлом:
http://www.vcskicks.com/animated-windows-form.html
Моя единственная проблема сейчас - поддерживать плавную анимацию, если я хочу иметь разные скорости анимации. В моем коде важны два значения: FPS и PX . FPS представляет количество кадров в секунду (что еще), а PX представляет количество пикселей для перемещения формы.
Задача 1) Чтобы получить максимально плавную анимацию, я бы предпочел, чтобы форма перемещалась на 1 пиксель за раз, но я не думаю, что смогу перемещать форму так же быстро, как я. хочу так. Увеличение значения FPS до очень высокого значения, похоже, не дает никакого эффекта, как будто есть предел, и выше этого предела не будет видимых различий. Я уверен, что есть хорошее объяснение этому.
Мой вопрос здесь: у вас есть какое-нибудь хорошее решение для этой проблемы или единственное решение - изменить значение PX и переместить форму более чем на 1 пиксель, если я хочу более быстрое движение?
Задача 2) Если решение вышеуказанного вопроса заключается в соответствующем изменении значения PX, я обнаружил (путем тестирования различных значений), что значение FPS, равное 300, будет достаточным для моих потребностей в перемещении формировать так медленно и так быстро, как я хочу. Затем, если мне нужно 10 скоростей, перемещение формы на 1, 2, 3, 4, 5, 6, 7, 8, 9 и 10 пикселей обеспечивает медленную и быструю плавную анимацию, как я и хочу. Если бы я хотел 5 скоростей, я мог бы использовать, например, 2, 4, 6, 8, 10.
Мой вопрос здесь такой: есть ли проблема в использовании значения, такого как 300, для FPS? Есть ли плохие последствия для такой стоимости?
А вот мой текущий код:
public partial class Form1 : Form {
bool dir = true;
public Form1() {
InitializeComponent();
Location = new Point(1280/2 - Width, 800/2 - Height/2);
}
private void button1_Click(object sender, EventArgs e) {
double FPS = 300;
int PX = 1;
long lastTicks = 0;
long currentTicks = 0;
double interval = (double)Stopwatch.Frequency / FPS;
while(dir ? Left <= 1280/2 : Left >= 1280/2 - Width) {
Application.DoEvents();
currentTicks = Stopwatch.GetTimestamp();
if(currentTicks >= lastTicks + interval) {
lastTicks = Stopwatch.GetTimestamp();
this.Location = new Point(dir ? Left + PX : Left - PX, Top);
this.Invalidate(); //refreshes the form
}
Thread.Sleep(1); //frees up the cpu
}
dir = !dir;
}
}
Примечание: Это просто пример кода, для целей тестирования, а не настоящий код, но будьте моим гостем, если вы хотите указать на некоторые очень важные вещи, которые я должен учитывать при переносе этого на реальное приложение.