| |
ельной задачи. Он занимается последовательным
рисованием кадров нашего видеофильма.
Прежде всего метод run записывает нулевое значение в поле m_nCurrImage,
хранящее номер текущего отображаемого кадра:
m_nCurrImage = 0;
Далее выполняется проверка, загружены ли все кадры видеофильма, для чего
анализируется содержимое флага m_fAllLoaded.
Если изображения не загружены (а в самом начале так оно и есть) метод run
перерисовывает окно аплета и получает контекст отображения для этого окна.
Затем создается массив объектов Image для хранения кадров видеофильма:
m_Images = new Image[NUM_IMAGES];
Метод run создает также объект класса MediaTracker для ожидания загрузки
всех кадров видеофильма:
MediaTracker tracker = new MediaTracker(this);
Далее метод run в цикле загружает изображения и добавляет их в объект класса
MediaTracker для того чтобы можно было дождаться загрузки всех кадров:
for (int i = 0; i < NUM_IMAGES; i++)
{
strImage = "images/cdimg0" + ((i < 10) ? "0" : "") +
i + ".gif";
m_Images[i] = getImage(getDocumentBase(), strImage);
tracker.addImage(m_Images[i], 0);
}
Здесь предполагается, что файлы изображений находятся в каталоге images,
который, в свою очередь, размещен там же, где и двоичный файл аплета.
Имена файлов, составляющих отдельные кадры, начинаются с префикса cdimg0,
вслед за которым идет номер кадра (00, 01, 02, и так далее), и расширение имени
.gif.
Ожидание загрузки кадров выполняется с помощью метода waitForAll, о котором
мы вам уже рассказывали:
try
{
tracker.waitForAll();
m_fAllLoaded = !tracker.isErrorAny();
}
catch (InterruptedException e)
{
}
После окончания ожидания флаг завершения загрузки устанавливается только в
том случае, если метод isErrorAny вернул значение false, то есть если не было
никаких ошибок.
Если же произошла ошибка, в окне аплета отображается соответствующее
сообщение, после чего работа метода run (и, следовательно, работа созданной для
него задачи) заканчивается:
if(!m_fAllLoaded)
{
stop();
m_Graphics.drawString(
"При загрузке изображений произошла ошибка",
10, size().height / 2);
return;
}
В случае удачной загрузки всех кадров метод run получает ширину и высоту
первого кадра видеофильма и сохраняет эти значения в переменных m_nImgWidth и
m_nImgHeight:
m_nImgWidth = m_Images[0].getWidth(this);
m_nImgHeight = m_Images[0].getHeight(this);
Далее окно аплета перерисовывается:
repaint();
При этом метод paint отображает в окне аплета первый кадр видеофильма.
На следующем этапе работы метода run запускается цикл отображения кадров
фильма:
while (true)
{
try
{
displayImage(m_Graphics);
m_nCurrImage++;
if(m_nCurrImage == N
|
|