Под анимацией понимается динамическая смена изображения на форме или в элементе управления PictureBox. Для отсчёта интервалов времени используется невизуальный элемент Timer. Важнейшее свойство этого элемента – Interval, которое определяет частоту срабатывания таймера. Значение свойства измеряется в миллисекундах, по умолчанию установлено значение 100.
Нормальной скоростью смены кадра считается 24 кадра в секунду, но это используется в основном при демонстрации фильмов (т.е. огромного числа кадров). При небольшом числе кадров вполне приемлемым оказывается значение 1000, т.е. 1 кадр в секунду.
Важнейшее событие таймера – Tick,генерируется при истечении интервала срабатывания таймера. Вобработчик этого события помещается код смены изображения. Старт таймера осуществляется с помощью метода Start, остановка – с помощью метода Stop.
Сами изображения могут помещаться в элемент управления ImageList с помощью изменения значения свойства Images. Порядковые номера рисунков (индексы) начинаются с нуля.
Пример.Пусть в ImageList имеется 5 изображений. Обеспечить их смену с частотой 1 кадр в секунду в элементе управленияPictureBox. Объявим переменную img типа Integer с атрубутомPublic, в которую будет помещён порядковый номер изображения. Необходимо создать форму, нанести на неё кнопку, элементы PictureBox, ImageList, и Timer. На кнопку необходимо нанести надпись, например «Начать показ». Затем необходимо установить значение свойства Interval у элемента Timer, равным 1000. После этого необходимо поместить 5 изображений в ImageList.
Вобработчик события Timer1_Tick необходимо записать следующий код:
Visual Basic .Net:
img = img + 1
PictureBox1.Image = ImageList1.Images(img)
If img = 4 Then img = -1
Visual C#:
img = img + 1;
pictureBox1.Image=imageList1.Images
if (img==4) img=-1;
Последняя строка обеспечивает цикличность демонстрации, как только будет продемонстрировано последнее изображение, будет автоматически осуществлён переход к первому.
Вобработчик события нажатия кнопки необходимо записать код старта таймера:
Visual Basic .Net:
Timer1.Start()
Visual C#:
timer1.Start();
Остановка таймера будет осуществлена при закрытии формы. Можно обеспечить остановку с помощью программного кода.
Таймер можно стартовать автоматически. Для этого нужно установить его свойство Enabled, равное True.
Недостатками такого способа являются ограничение числа изображений, которое можно загрузить в ImageList (определяется объёмом памяти), а также то, что размер изображения не может превышать 256 х 256 пикселей. Поэтому чаще всего изображения для анимации помещают в определённую папку, из которой затем выбирают их.
Для работы с папками компьютера используют специальный объект Directoty. Этот объект принадлежит базовому классу System.IO, который необходимо импортировать в проект. Для получения списка файлов в заданной папке используется метод GetFiles, имеющий синтаксис:
Visual Basic .Net:
Files=Directory.GetFiles(имяпапки, фильтр)
Visual C#:
Files=Directory.GetFiles(имяпапки, фильтр);
Имя папки следует указывать полностью,для C# в качестве разделителя папок используется двойной слеш, фильтр является необязательным параметром и задаёт шаблон для отбора файлов, например, по расширению. Переменная, в которую помещается результат, объявляется как динамический массив:
Visual Basic .Net:
Dim Files as String()
Visual C#:
String [] files;
Размерность массива будет указана автоматически при заполнении его методом GetFiles. Для доступа к списку файлов из всех процедур ему необходимо присвоить атрибут Public в области описаний модуля. Пример использования данного метода:
Visual Basic .Net:
files = Directory.GetFiles("C:\DocumentsandSettings\User\Моидокументы\VisualStudio 2005\Projects\графика1\Resources", "*.jpg")
Visual C#:
files=Directory.GetFiles("("C:\\Documents and Settings\\User\\Моидокументы\\Visual Studio 2005\\Projects\\графика1\\Resources"","*.jpg");
Массив файлов является объектом, его свойство Length определяет число файлов в заданной папке.
Пример.Обеспечить в элементе изображения PictureBox смену изображений из некоторой папки с частотой 1 кадр в секунду Объявим переменные img (порядковый номер изображения) и img_count (число изображений в папке) типа Integer с атрибутом Public. Также объявим с данным атрибутом массив строк, куда поместим имена всех графических файлов из папки:
Visual Basic .Net:
Public img, img_count AsInteger
Public files() AsString
Visual C#:
Public int img,img_count;
Public string [] files;
Необходимо создать форму, нанести на неё элементы PictureBox, Timer и Button с соответствующей надписью. В код обработчика события Click кнопки необходимо записать код, сканирующий заданную папку, выбирающую из неё все файлы изображений, вычисляющий их количество и стартующий таймер:
Visual Basic .Net:
files = Directory.GetFiles("C:\графика1", "*.jpg")
img_count = files.Length
Timer1.Start()
Visual C#:
files=Directory.GetFiles("C:\\графика1","*.jpg");
img_count=files.Length;
timer1.Start();
Фильтрация файлов необходима, т.к. даже если в папке имеются только файлы изображений, в ней могут оказаться скрытые неграфические файлы, что может привести к ошибке.
В обработчик события Timer1_Tick необходимо записать следующий код:
Visual Basic .Net:
PictureBox1.Image = Image.FromFile(files(img))
img = img + 1
If img = img_count Then img = 0
Visual C#:
pictureBox1.Image=Image.FromFile(files
img=img+1;
if (img==img_count) img=0;
Данный код работает в том случае, если в папке с файлами имеется хоть один графический файл. Но вообще говоря, эту ситуацию необходимо проверять, и в случае отсутствия графических файлов выдавать сообщение об ошибке.
Папка с изображениями здесь задается вручную. Для выбора папки в процессе работы с программой можно воспользоваться элементом управления FolderBrowserDialog. События этого объекта используются редко. Реакция пользователя оценивается значением переменной DialogResult, имя выбранной пользователем папки записывается в качестве значения свойства SelectedPath. Здесь также следует проверять, имеются ли в папке графические файлы или нет, например, сравнивая число обнаруженных графических файлов с нулём. В этом случае код обработчика события нажатия кнопки «Начать показ» будет примерно следующим:
Visual Basic .Net:
Dim result As DialogResult
result = FolderBrowserDialog1.ShowDialog()
If (result = Windows.Forms.DialogResult.OK) Then
files = Directory.GetFiles(FolderBrowserDialog1.SelectedPath, "*.jpg")
img_count = files.Length
If img_count = 0 Then
MsgBox("В данной папке нет графических файлов", MsgBoxStyle.OkOnly)
Else
Timer1.Start()
EndIf
EndIf
Visual C#:
DialogResult result;
result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpg");
img_count = files.Length;
if (img_count == 0) MessageBox.Show("В данной папке нет графических файлов", "Ошибка!", MessageBoxButtons.OK);
else timer1.Start();
}
С помощью данных методов и объектов можно также осуществлять движение путем перемещения объекта PictureBox по форме или изменяя его размеры.
Замечание: в качестве фильтра для объекта FolderBrowserDialog можно использовать только одно значение, следовательно, можно отбирать только графические данные одного типа.