В своем приложении для Android я создал класс конвертера изображений SVG.Он анализирует данные SVG XML и преобразует их в соответствующие объекты Path, Paint и Matrix, которые затем могут быть применены к Canvas.Используя этот класс, я затем реализовал View, который использует мой класс конвертера SVG для рисования изображений, которые я создал в Inkscape на экране.Все идет нормально.(Я ценю, что написание моего собственного SVG-конвертера можно считать переизобретением колеса, учитывая, что это было сделано раньше, но для меня это полезное упражнение в моем первом приложении для Android, и, надеюсь, даст мне дополнительную гибкость.)
Цель использования SVG состоит в том, чтобы я мог быстро и легко создавать различные конструкции графических датчиков.Каждый датчик обычно состоит из графического фрагмента, который необходимо нарисовать только один раз (например, грань датчика и условные обозначения), а также графики, которые регулярно обновляются (угол указателя, текст числового значения).
В настоящее время мой датчикПредставление не очень эффективно, потому что каждый раз, когда вызывается onDraw (), мой SVG-класс вызывается для обработки всего SVG-файла, чтобы получить все векторные данные для Canvas.
Я хотел бы иметь промежуточное хранилище векторных данных, чтобы файл SVG XML анализировался только один раз.Поэтому я подумал, что View может лениво инициализировать себя из файла SVG в первом onDraw (), а затем сохранять все полученные объекты Paths, Paint и Matrix в различных списках.Затем, в каждом последующем onDraw (), я просто вытаскиваю их из списка и перебираю их на холсте.
Еще одним преимуществом этого является использование отдельных списков для хранения «движущихся» участков векторной графики, например указателя датчика.Я подумал об этом, назначив определенный «магический» идентификатор группе путей в Inkscape, которые представляют указатель;Класс синтаксического анализатора SVG затем распознает, что эта отдельная группа должна храниться отдельно от неподвижной графики.Затем, когда мне нужно обновить угол наклона указателя в соответствии с данными измерений, представление будет применять только вращательное преобразование к этой группе векторных данных.Фактически, я думаю сделать это так, чтобы графика движущегося указателя фактически рисовалась в дочернем представлении, так что только дочерний вид перерисовывается, когда указатель должен быть обновлен.
Конечная цель всего этого заключается в следующем: я (или, возможно, даже пользователи) мог бы запустить программу векторной визуализации, такую как Inkscape, и быстро создать новый дизайн виджета датчика.Я вставил немного метаданных, чтобы указать, какими битами графики нужно манипулировать в соответствии с данными измерений.
Вместо того, чтобы спрашивать о решении проблемы как таковой, я хотел бы услышать мнения о том, что я здесь делаю, и о том, можно ли сделать то, что я предлагаю, гораздо более оптимизированным способом.Может ли быть очень неэффективно использование памяти для кэширования групп объектов Path и Paint?
Более того, как только это станет достаточно (!), Я с удовольствием опубликую свой класс SVG где-нибудь, если кто-нибудь посчитает его полезным.