Приведенный ниже пример показывает насколько просто можно использовать векторныеSVG изображения вJava ME приложениях.
Scalable Vector Graphics (SVG), как собственно следует из названия, являются масштабируемыми, то есть векторная картинка может быть нарисована в любом разрешении без потери качества. Собственно сам размер картинки первоначально задается вSVG файле, а потом может быть изменен средствами API.
JSR 226 API обеспечивает простой механизм загрузки и отображенияSVG файлов. Сначала необходимо получить доступ к картинке как кInputStream, используя методClass.getResourceAsStream(). Для загрузкиSVG вызывается методjavax.microedition.m2g.SVGImage.createImage(), которому в качестве параметра передается указанныйInputStream. После того как ресурс загружен, он доступен какSVGImage объект. Для отображения картинки на экране используются методы классаjavax.microedition.m2g.ScalableGraphics. Так для отображения картинки нужно создать класс-потомокCanvas. В этом классе нужно создать экземплярScalableGraphics класса, а затем вызвать методSVGImage.bindTarget(), который связывает его сCanvas. Для отрисовкиSVG изображения нужно использовать методScalableGraphics.render(). После того как рендеринг завершен нужно вызватьScalableGraphics.releaseTarget() и освободить Canvas.
Для изменения размеров изображения, можно использовать методыsetViewportWidth(),setViewportHeight().
Отображение векторной графики вJava ME мидлете средствамиJSR 226 API
import javax.microedition.m2g.SVGImage; import javax.microedition.midlet.*; ... // Это класс, в котором происходит загрузка svg изображения, которое затем // передается в SVGImageCanvas для отображения на экране. publicclass RenderSVGImageDemoextends MIDlet implements CommandListener{ ..... // Аолучаем входящий поток для SVG рисунка, // расположенного в jar архиве мидлета. InputStream svgDemoStream= getClass().getResourceAsStream(svgImageName); ... // Создаем объект SVGImage на основании входящего потока. SVGImage svgImage=(SVGImage) SVGImage.createImage(svgDemoStream,null); ... // Создаем объект SVGImageCanvas, передаввя ему в // качестве параметра svgImage. svgCanvas=new SVGImageCanvas(svgImage); ... // Делаем svgCanvas видимым, то есть вызываем его // метод рисования. Display.getDisplay(this).setCurrent(svgCanvas); .... } // MIDP Canvas, в котором происходит отображение // SVG графики с помощью ScalableGraphics class SVGImageCanvasextends Canvas{ // SVGImage рисуемый на canvas. protected SVGImage svgImage; ..... // ScalableGraphics используется для рисования // svg картинки в MIDP Graphics. protected ScalableGraphics sg= ScalableGraphics.createInstance(); .... public void paint(Graphics g){ // Связываем ScalableGraphics с экземпляром класса MIDP's Graphics sg.bindTarget(g); // Устанавливаем размеры рисунка svgImage.setViewportWidth(getWidth()); svgImage.setViewportHeight(getHeight()); // Выводим картинку в точке(0,0) sg.render(0,0, svgImage); // Освобождаем MIDP Graphics sg.releaseTarget(); } ... }
Существует два способа анимированияSVG графики: декларативная анимация и "ручное" изменение параметровSVG изображения (например цвет или положение) с помощью вызова API функций. Приведенный ниже пример иллюстрирует декларативную анимацию, то есть SVG файл уже содержит в себе все данные об анимации.
Для проигрывания анимированных SVG файлов используется класс javax.microedition.m2g.SVGAnimator. SVGAnimator содержит методы запуска, паузы и остановки анимации.
import javax.microedition.m2g.SVGAnimator; import javax.microedition.m2g.SVGImage; import javax.microedition.lcdui.Canvas; ... // Создаем InputStream для SVG рисунка. InputStream svgDemoStream= getClass().getResourceAsStream(svgImageName); ... // Получаем из потока SVGImage SVGImage svgImage=(SVGImage) SVGImage.createImage(svgDemoStream,null); ... // Создаем SVGAnimator из SVGImage. SVGAnimator содержит все данные // об анимации и позволяет проигрывать ее. SVGAnimator svgAnimator= SVGAnimator.createAnimator(svgImage); ... // Получаем Canvas управляемый SVGAnimator и устанавливаем // размер для svgImage svgCanvas=(Canvas)svgAnimator.getTargetComponent(); svgImage.setViewportWidth(svgCanvas.getWidth()); svgImage.setViewportHeight(svgCanvas.getHeight()); ... // Будем отслеживать события нажатия клавиш и в зависимости // от нажатой клавиши будем проигрывать, делать паузу или останавливать ролик svgAnimator.setSVGEventListener(this); ... public void keyPressed(int keyCode){ if((keyCode== KEY_PLAY)&&(state!= STATE_PLAYING)){ svgAnimator.play();//запуск .... } if((keyCode== KEY_PAUSE)&&(state== STATE_PLAYING)){ svgAnimator.pause();//пауза .... } if((keyCode== KEY_STOP)&&(state!= STATE_STOPPED)){ svgAnimator.stop();//остановка .... } ...
Источники:
Render an SVG Image
Play an SVG Animation