Использование библиотеки масштабируемой векторной графики в Android на базе архитектуры Intel

Формат масштабируемой векторной графики (Scalable Vector Graphics, SVG) — это семейство спецификаций на базе XML, предназначенных для хранения двумерной статической и динамической (интерактивной или анимированной) векторной графики, а также текста или встроенных растровых изображений. Спецификация SVG является полностью открытым межплатформенным стандартом и разрабатывается консорциумом W3C с 1999 г.

Формат и способ обработки SVG-изображений задается так же, как в обычных XML-файлах, что позволяет выполнять поиск, индексировать, добавлять сценарии и при необходимости сжимать изображения. SVG-файлы (аналогично XML) можно создавать и изменять в любом текстовом редакторе.

Несмотря на небольшой размер, они позволяют хранить высококачественную графику для веб-сайтов, печати и компактных устройств с ограниченными ресурсами. Кроме того, формат SVG поддерживает сценарии и анимацию, поэтому идеально подходит для создания интерактивной, красочной графики.

Использование формата SVG дает массу преимуществ. Во-первых, для него не нужно создавать несколько вариантов изображения в различных разрешениях. Во-вторых, этот формат основан на XML, поэтому изображения получаются намного меньшими по объему, чем такие же растровые. И наконец, изображения можно изменять «на лету».

Формат SVG поддерживает графические объекты трех типов: векторные, растровые и текстовые. Графические объекты, в том числе растровые PNG- и JPEG-изображения, можно группировать, форматировать и преобразовывать, а также накладывать на другие объекты.

Платформенные приложения Android * не поддерживают XML-подобные SVG-файлы, однако браузеры, начиная с версии Android 3.0, могут их обрабатывать (см. рис. 1). В этой главе показано, как интегрировать библиотеку со свободным исходным кодом SVG-Android в кодовую базу, а также рассмотрен пример приложения для ОС Android Ice Cream Sandwich (ICS) на базе архитектуры Intel®.

1. Функциональность SVG

В спецификации SVG 1.1 определены 14 функциональных групп:

  • Пути
  • Основные фигуры
  • Текст
  • Заливка
  • Цвет
  • Градиенты и шаблоны
  • Обрезка, применение маски и наложение
  • Фильтры
  • Интерактивность
  • Связывание
  • Скрипты
  • Анимация
  • Шрифт
  • Метаданные

2.  Фигуры SVG

В формате SVG заранее определены следующие фигуры:

  • Прямоугольник <rect>

<svg>
<rect x="50" y="20" width="150" height="150" style="fill: red;
stroke: yellow; stroke-width: 5; opacity: 0.5" />
</svg>

  •  Окружность <circle>

<svg >
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2"
fill="red" />
</svg>

  •  Эллипс <ellipse>
  •  Прямая <line>
  •  Ломаная <polyline>
  •  Многоугольник <polygon>
  • Путь <path>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<path d="M150 0 L75 200 L225 200 Z" />
</svg>

Рисунок 1. Реализация SVG на устройстве Android.

Источник: Intel Corporation, 2012 г.

 3.  Интеграция библиотеки SVG

Создайте файл описания svgandroid.xml для библиотеки svgandroid.jar. Затем скопируйте эту библиотеку в папку /system/framework, а файл svgandroid.xml — в папку /etc/permissions. Приложения получат информацию о библиотеке svgandroid.jar из файла svgandroid.xml.

Добавьте следующий код в файл svgandroid.xml:

 

<?xml version="1.0" encoding="utf-8">
<permissions>
<libraryname="svgandroid" file="/system/framework/svgandroid.jar"/>
</permissions>

Добавьте инструкцию <use-library> в файл AndroidManifest.xml для загрузки пакетов svgandroid (они не будут загружаться автоматически).

<uses-library android:name="svgandroid" android:required="true" />

Установите для параметра android:required значение true. ОС Android не разрешит запуск приложения на устройстве без этой библиотеки.

Если приложение установлено без нее, возникнет следующая ошибка:

Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY]

Данный элемент также управляет доступом к приложению на Android Маркете. При отсутствии библиотеки устройство Android не сможет отобразить приложение на Android Маркете.

4. Отображение файлов с помощью модифицированной библиотеки SVG

В этом разделе показано, как отображать файлы с помощью измененной библиотеки SVG.

4.1. Что такое SAX?

SAX (Simple API for XML) — это API для последовательного разбора XML-документов на основе событийной модели, разработанное сообществом XML-DEV. В SAX используется совершенно другой механизм чтения данных из XML, чем в объектной модели документов (Document Object Model, DOM). В DOM весь документ обрабатывается как единое целое, а SAX-анализаторы считывают каждый его фрагмент по порядку.

4.2. Преимущества

SAX-анализаторы обладают рядом преимуществ по сравнению с DOM. Во-первых, им требуется намного меньше памяти. Анализаторы на базе DOM сохраняют все дерево документа перед обработкой, поэтому объем необходимой для них памяти напрямую зависит от количества исходных данных. В то же время объем памяти, необходимый SAX-анализаторам, определяется максимальной глубиной иерархии XML-файла и максимальным количеством данных в его атрибутах. Оба этих показателя всегда меньше, чем общий размер дерева.

Во-вторых, благодаря своей событийной модели SAX-анализаторы обычно обрабатывают документы быстрее, чем DOM-анализаторы. Это также обусловлено тем, что DOM-анализаторам приходится резервировать много памяти, а потоковое чтение с диска в DOM невозможно. И наконец, SAX-анализаторы в отличие от DOM работают с XML-файлами, размер которых превышает объем системной памяти. Впрочем, DOM-анализаторы для этой цели могут использовать дисковое пространство.

4.3. Недостатки

Несмотря на свою эффективность при разборе XML-документов, SAX обладает и рядом недостатков.

В некоторых случаях для проверки XML-документа необходим доступ ко всему файлу. Например, если в документе определен атрибут DTD IDREF, то должен быть и элемент, в котором используется его идентификатор.  Чтобы проверить эту зависимость в SAX-анализаторе, необходимо учитывать все найденные ранее идентификаторы и атрибуты IDREF. Однако если хотя бы один из элементов IDREF не соответствует идентификатору, пользователь узнает об этом только после завершения анализа. В результате время, отведенное на проверку, расходуется неэффективно, так как дальнейшая проверка не имеет смысла.

Также в некоторых задачах обработки XML необходимо обращаться сразу ко всему документу. К примеру, процессорам XSLT и XPath требуется постоянный доступ ко всем узлам дерева XML-документа. Хотя такое дерево можно построить и с помощью SAX-анализаторов, в DOM это делается автоматически.

4.4. Реализация SAX-анализатора в Android

Для написания SAX-анализатора класс должен унаследовать DefaultHandler. Это базовый класс для обработчиков событий SAX2 в Android, при его наследовании необходимо переопределить несколько методов, включая startElement, endElement, startDocument и endDocument. Назначение каждой функции понятно по ее имени. Например, метод startDocument создает событие и вызывается в тот момент, когда SAX-анализатор начинает разбор документа. Как только SAX-анализатор проверит первый тег в XML-файле, будет создано событие startElement, содержащее имя и атрибуты этого тега, а также дополнительную информацию о нем. Назначение методов endDocument, startElement и endElement также очевидноy.

4.5. Почему исходную библиотеку SVG пришлось изменить?

Исходная библиотека не может обрабатывать SVG-файлы с атрибутами группового тега (<g>), поэтому нам пришлось добавить регистр для хранения атрибута стиля в этом теге. Если в документе уже определен атрибут стиля, он заменит собой аналогичный атрибут в теге <g>.

Для разбора SVG-файлов рекомендуется использовать SAX-анализатор. При анализе тега <g> весь атрибут копируется в объект –g_prop, который является внутренним классом свойств.

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException
{
……
} else if (localName.equals("g")) {
……
pushTransform(atts);
g_prop = new Properties(atts);
}
……
}
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException
 
{
……
} else if (localName.equals("g")) {
……
pushTransform(atts);
g_prop = new Properties(atts);
}
……
}
 

При разборе <rectangle>, <path> и других тегов отрисовки необходимо проверить, определены ли для них стили, если да, то получить соответствующие атрибуты. С помощью методов doFill и doStroke можно задать способ заливки и толщину линий, а затем отобразить проанализированный элемент на полотне.

 

Properties props = new Properties(atts);
if (doFill(props, gradientMap))
{
doLimits(p);
canvas.drawPath(p, paint);
}
else
{
if(g_prop != null)
{
if(doFill(g_prop, gradientMap))
{
doLimits(p);
canvas.drawPath(p, paint);
}
}
}
if (doStroke(props))
canvas.drawPath(p, paint);
else
{
if(g_prop != null)
{
if(doStroke(g_prop))
canvas.drawPath(p, paint);
}
}
popTransform();
}
Properties props = new Properties(atts);
if (doFill(props, gradientMap))
{
doLimits(p);
canvas.drawPath(p, paint);
}
else
{
if(g_prop != null)
{
if(doFill(g_prop, gradientMap))
{
doLimits(p);
canvas.drawPath(p, paint);
}
}
}
 
if (doStroke(props))
canvas.drawPath(p, paint);
else
{
if(g_prop != null)
{
if(doStroke(g_prop))
canvas.drawPath(p, paint);
}
}
popTransform();
}

3.6.   Файл XML SVG-файл с атрибутами в теге отрисовки

Ниже приведен файл XML SVG с атрибутами в теге отрисовки (см. рис. 2). 

<path display="none" fill="#FFFFFF"

d="M268.461,471.01c2.526,0,4.575,2.048,4.575,4.571c0,2.529-2.049,4.576-4.575,4.576

c-2.525,0-4.574-2.047-4.574-4.576C263.887,473.058,265.936,471.01,268.461,471.01z"/>

Рисунок 2. Реализация SVG на устройстве Android

Источник: Intel Corporation, 2012 г.

4. Файл XML SVG файл с атрибутами в групповом теге

Ниже приведен файл XML SVG с атрибутами в групповом теге.

<g style="fill: #ffffff; stroke:#000000; stroke-width:0.172">

<path d="M-122.304 84.285C-122.304 84.285 -122.203 86.179 -123.027 86.16C-123.851 86.141 -140.305 38.066 -160.833 40.309C-160.833 40.309 -143.05 32.956 -122.304 84.285z"/>

</g>

Рисунок 3. Реализация SVG на устройстве Android.

Источник: Intel Corporation, 2012 г.

Reportez-vous à notre Notice d'optimisation pour plus d'informations sur les choix et l'optimisation des performances dans les produits logiciels Intel.