Программирование на языке Java

         

ImageObserver



ImageObserver

ImageObserver - это абстрактный интерфейс, используемый для получения сообщения о создании изображения, Метод imageUpdate из ImageObserver - это все, что вы должны реализовать в своем апплете для его использования. В то время, как вы получаете информацию о загрузке, вы можете показывать любую понравившуюся вам мультипликацию, индикатор степени завершения загрузки или любую другую заставку. Для использования ImageObserver в своем подклассе Applet вы должны добавить в него строку implement ImageObserver, как показано в этом фрагменте программы: public class MyApplet extends Applet implement ImageObserver {

Затем вам придется вставить в свой класс метод imageUpdate для интерфейса ImageObserver, как показано в следующем фрагменте : public boolean imageUpdate(Image img, int status, int x, int у int width, int height) { if((status & ALLBITS) != 1) { System.out.println("Still processing the image"); return true; } else { System.out.println("Done processing the image"); return false; } }

Метод imageUpdate вызывается с изображением Image, которое находится в процессе изменения, целым параметром status, отражающим состояние изменения, и с координатами прямоугольника (x, у, width, height), которые соответствуют различным величинам в зависимости от информационных флагов, перечисленных ниже. ImageUpdate должен возвращать false по окончании загрузки изображения и true - если изображение еще обрабатывается.

Целая переменная status поразрядно проверяется на наличие одного или нескольких флагов. Возможные флаги и информация, которую они несут, перечислены ниже:



WIDTH Ширина изображения доступна и может быть взята из аргумента width.
HEIGHT Высота изображения доступна и может быть взята из аргумента height.
PROPERTIES Свойства изображения теперь доступны. Вы можете получить их посредством art.properties.
SOMEBITS Доступны пиксели, необходимые для рисования масштабированного варианта изображения. Область, содержащая новые пиксели, задается параметрами x, у, width и height.
FRAMEBITS Еще один кадр ранее нарисованного изображения с несколькими кадрами, готов для перерисовки. Параметры x, у, width, height не содержат информации.
ALLBITS Обработка перерисовываемого изображения окончена, и оно может быть отрисовано в конечном виде. Значения аргументов x, у, width и height не содержат значимой информации.
ERROR При пересылке изображения возникла ошибка. Поступление дальнейшей информации стало невозможным и рисование прервано. Для удобства выставляется и флаг ABORT для индикации прерывания загрузки изображения.
ABORT Пересылка изображения была прервана до полного его получения. Поступление новой информации стало невозможным без дополнительных действий по повторному запуску операций по получению изображения. Если флаг ERROR не был выставлен, то приход любых данных изображения снова запустит процесс его получения.

Теперь давайте рассмотрим программный пример, который использует ImageObserver для показа количества обработанных строк изображения и выводит эту информацию (переменная progress) на консоль: /* <title>ObservedImageLoad</title> * <applet code="ObservedImageLoad" width=290 height=140> * <param name="img" value="mupk.gif"> * </applet> */ import java.applet.*; import java.awt.*; import java.awt.image.*; public class ObservedImageLoad extends Applet implements Runnable, ImageObserver { Image art; Dimension d; int progress; Thread motor; boolean loaded; public void init() { art = getImage(getDocumentBase(), getParameter("img")); loaded = false; progress = 0; } public void paint(Graphics g) { d = this.getSize(); loaded = g.drawImage(art, 0, 0, this); } public boolean imageUpdate(Image img, int info, int x, int y, int width, int height) { if((info & ALLBITS) != 1) { if(progress<d.height) { progress = progress+height; } System.out.println(progress+"/"+d.height); return true; } else { return false; }} public void start() { motor = new Thread(this); motor. start(); } public void stop() { motor.stop(); } public void run() { motor.setPriority(Thread.MIN_PRIORITY); while(!loaded) { // update progress indicator (5 fps) repaint(); try { motor.sleep(200); } catch(InterruptedException e) {} } } }

Метод imageUpdate обрабатывает статус загрузки изображения. Информация о статусе передается через переменную info, с которой сравнивается статическая переменная ALLBITS. Если еще не получено все изображение, то мы добавляем величину heihgt к общему числу обработанных строк изображения. Для проверки этой концепции мы выводим количество обработанных строк изображения на консоль. Метод run перерисовывает апплет пять раз в секунду (каждые 200 миллисекунд) до тех пор, пока изображение art не загрузится. То, как долго монитор статуса загрузки будет работать, зависит от скорости передачи данных изображения по сети - ObservedImageLoad.html.



Содержание раздела