Conversión SVG – forma eficiente de almacenar objetos de Trayectoria, Pintura y Matriz?

En mi aplicación de Android he creado una clase de conversor de imagen SVG. Analiza a través de los datos XML de SVG y lo convierte en los objetos apropiados de Trayectoria, Pintura y Matriz que luego se pueden aplicar al lienzo. Usando esta clase, he implementado una vista que utiliza mi clase de convertidor SVG para dibujar las imágenes que he producido en Inkscape en la pantalla. Hasta aquí todo bien. (Reconozco que escribir mi propio conversor SVG podría considerarse una reinvención de la rueda considerando que se ha hecho antes, pero para mí es un ejercicio de aprendizaje útil en mi primera aplicación para Android y espero que me dé alguna flexibilidad adicional).

El propósito de usar SVG es para que pueda rápida y fácilmente autor varios diseños de calibre gráfico. Cada calibre consta normalmente de una sección de gráficos que sólo necesitan dibujarse una vez (por ejemplo, la cara del indicador y las leyendas), además de gráficos que se actualizan regularmente (ángulo de puntero, texto de valor numérico).

En la actualidad mi vista de indicador no es muy eficiente porque cada vez que se llama a onDraw (), mi clase SVG se llama para traquetear a través de todo el archivo SVG para producir todos los datos vectoriales para el lienzo.

Lo que me gustaría hacer es tener algún almacenamiento intermedio de los datos vectoriales para que el archivo SVG XML sólo necesita ser analizado una vez. Por lo tanto, yo estaba pensando que la vista podría perezoso-inicializar a sí mismo desde el archivo SVG en el primer onDraw () y, a continuación, almacenar todos los objetos de trayectos, pintura y matriz resultante a varias listas. Luego, en cada onDraw siguiente (), sólo sacar los de la lista (s) y traqueteo a través de ellos en el lienzo.

Otra ventaja de esto sería utilizar listas separadas para almacenar secciones de gráficos vectoriales que están "moviéndose", por ejemplo el puntero de indicador. Pensé en hacer esto asignando una cierta identificación "mágica" al grupo de las trayectorias en Inkscape que representan el indicador; La clase de analizador de SVG reconocería entonces que este grupo separado necesita ser almacenado por separado para los gráficos 'quietos'. Entonces, cada vez que necesite actualizar el ángulo del puntero de acuerdo con los datos de medición, la vista sólo aplicará la transformación rotacional a ese grupo de datos vectoriales. De hecho, estoy pensando en hacerlo de modo que los gráficos del puntero en movimiento se dibujen en realidad en una Vista secundaria, de modo que sólo se vuelva a dibujar la vista secundaria cuando el puntero tenga que actualizarse.

El objetivo final de todo esto es esto: yo (o tal vez incluso los usuarios) podría encender un programa de imágenes vectoriales como Inkscape y producir rápidamente un nuevo diseño de widget de indicador. Incorporo un poco de metadatos para indicar qué bits de los gráficos tienen que ser manipulados de acuerdo con los datos de medición.

En lugar de pedir una solución a un problema como tal, me gustaría escuchar opiniones sobre lo que estoy haciendo aquí, y si lo que estoy proponiendo podría hacerse de una manera mucho más optimizada. ¿Podría ser muy ineficiente la memoria para almacenar en caché los grupos de objetos Path y Paint?

Por otra parte, una vez que es lo suficientemente bueno (!) Voy a felizmente publicar mi clase SVG en algún lugar si alguien lo encuentra útil.

Implementar y medir! Comience con el enfoque directo: almacene los datos vectoriales analizados en listas en la memoria. Si el uso de memoria y la velocidad de representación es aceptable: problema resuelto. Si no, pruebe otras cosas y mida. Algunas ideas:

  • Analizar SVG una vez, renderizar una vez a Bitmaps, reutilizar bitmaps
  • Renderizar SVG como parte del proceso de construcción, enviar mapas de bits de ráster con la aplicación

Con excepción de los casos más simples, no somos muy buenos con evaluar cómo es eficaz una técnica particular va a ser. Así, el dicho popular de que la optimización prematura es la raíz de todo mal .

  • ¿Puede Android Dibujos definidos en XML contienen una ruta de acceso?
  • VectorDrawable - ¿está disponible de alguna manera para versiones pre-Lollipop de Android?
  • Android VectorDrawable no aparece en el diseño
  • Error al intentar probar AnimatedVectorDrawable, "No se puede cambiar de x a z"
  • Procesamiento de SVG bajo Java en Android y escritorio
  • Pros y contras de usar SVG para Android Juegos
  • Vector dibujable no dibujado correctamente en Android Studio
  • Soporte de SVG en Android, estado actual
  • Android: cargar archivo svg desde la web y mostrarlo en la vista de imagen
  • Cómo crear Android VectorDrawables de Illustrator (u otra herramienta similar)?
  • Imagen SVG no visible en android 3.0+ con el mismo código
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.