CAPÍTULO 1. Ambición
Finales de febrero de 2018
Nosotros, como partidarios de la ideología del software libre y el mercado libre, creemos que el monopolio es malo.
Un gran número de personas necesita una navegación conveniente y rápida en el metro. Es extraño que no haya un solo competidor digno para la aplicación Yandex.Metro. Decidimos crearlo nosotros mismos, haciéndolo en nuestro tiempo libre como hobby.
Equipo: en diferentes momentos de 2 a 4 personas.
La historia cubre solo la aplicación de Android, debido al hecho de que se lanzó primero y todos los mecanismos básicos se ejecutaron en ella. Por supuesto, la versión de iOS está actualmente disponible.
CAPÍTULO 2. La ruta en la oscuridad.
Marzo - junio de 2018.Necesito un mapa Tomamos SVG, lo
empujamos en
SVGView , todo está bien. Miente terriblemente, pero estamos alegres. ¿Cómo dibujar rutas separadas? Nadie lo sabe
En el formato SVG, no hay información sobre las capas, si un elemento pertenece a alguna línea u otra información que sea críticamente necesaria para construir una ruta. Entonces, utilizamos una base de datos para almacenar todos los elementos para renderizar.
Además, necesitábamos que la aplicación se ejecutara lo más rápido posible. El uso de
WebView desaparece inmediatamente, necesita una superficie GL. Decidimos probarlo con
SurfaceView (una superficie opengl que se puede usar como lienzo), no es eso. Puede realizar cambios dentro de sí mismo, parpadeando en negro, ya que simplemente está mal implementado y no puede soportar la carga más que renderizar un cubo de 20x20. Puede aumentar, desapareciendo una vez. Necesitábamos una solución diferente, pero que no estuviera tan lejos de SurfaceView, ya que era completamente adecuada para nosotros en la interfaz.
Brevemente sobre los errores del controlador de AndroidIntentamos una implementación en
TextureView . Y, oh Dios, la mayoría de los problemas se han ido. A pesar de que TextureView es un SurfaceView con esteroides, normalmente se implementa sin errores mágicos y ataques epilépticos del adaptador de video.
Todavía tenemos errores al sincronizar secuencias y ajustar vistas en forma de errores de segmentación ilegibles, pero esto fue mejor que un punto negro parpadeante. En consecuencia, cualquier uso de View no como debería ser, obliga a redefinir casi todos los métodos de View en sí. Esto fue especialmente problemático con TextureView porque este componente consta de 2 partes: Vista y Superficie. No pueden vivir el uno sin el otro, pero al mismo tiempo simplemente no pueden enviar el evento de muerte de Surface dentro de la Vista, por lo que debes hacer verificaciones manuales después de casi cada acción.
Los problemas comenzaron cuando tuvimos que aumentar la vista. Canvas dibuja todo píxel por píxel, por lo que si especificamos un tamaño de 400x400, los elementos de 0 a 400 serán visibles, pero no externos. 400 es muy pequeño, en realidad necesitamos un mapa de aproximadamente 5000x5600 píxeles en buenos dispositivos. Pero, ¿cómo encajar 5000x5600 en una pantalla de 1920x1080 (16: 9)?
Creamos un mapa de lienzo con un tamaño y una escala que aumentará con la resolución de la pantalla y disminuirá con una disminución en la resolución de la pantalla. Por lo tanto, resolvimos el problema de mapas muy grandes y dibujados torcidamente en dispositivos con una pantalla grande y mapas demasiado pequeños en pantallas pequeñas.
Cuando comenzamos a probar la tarjeta, resultó que en teléfonos con la misma resolución, la tarjeta se muestra de manera diferente. Bueno, de manera diferente: en uno se muestra, en el segundo un punto blanco / negro. Los registros conducen a un rastreador de errores Qualcomm a un error con chips Adreno 330/300 con el estado 'wontfix'. Genial
La única forma de vencer este error es subestimar el tamaño de la tarjeta en los teléfonos con un determinado chip de video para que no haya un cuadrado blanco en lugar de la tarjeta. Pero, ¿cómo sabemos el modelo del chip de video? Necesitamos crear un GLSurfaceView con un tamaño de 1x1 píxel al iniciar la aplicación, obtener información sobre el chip de video y solo luego dibujar un mapa.
"- Pero es una muleta". Sí, esto es una muleta. Esta es una muleta de escala galáctica, pero es mejor que cortar una gran cantidad de dispositivos y esperar que Qualcomm repare el error de sus controladores y envíe la actualización a todos los OEM para que podamos usar la tarjeta en teléfonos con estos controladores corruptos. Gracias a nuestros usuarios, pudimos encontrar una solución que funciona en todos los dispositivos.
¡Construimos, construimos y finalmente construimos!También una tarea muy interesante fue la superposición de elementos. Debido al hecho de que la rama roja se debe dibujar sobre el verde, el verde sobre el azul, el amarillo sobre el rojo, etc., ingresamos los números de capa, y nuestra aplicación (a simple vista simple) se volvió similar a Adobe Photoshop :)
Decidí cómo dibujar rutas. Ahora era necesario decidir cómo encontrar el mejor entre ellos. Para encontrar todas las rutas entre los vértices usamos el algoritmo Floyd-Warshall, para encontrar la ruta más corta usamos el algoritmo Dijkstra, para rutas alternativas el algoritmo Yen. Cualquier persona interesada en los detalles, haga preguntas en los comentarios.
CAPÍTULO 3. La ruta al sol
Junio - diciembre 2018En esta etapa, ya sabíamos qué hacer. Mejora el producto. Dibujamos nuevos mapas, agregamos nuevos idiomas, corregimos errores, aceleramos el trabajo, fijamos características, reunimos los comentarios de los usuarios y no gastamos un centavo en promocionar la aplicación.
El 15 de junio, implementamos nuestra aplicación para el lanzamiento, completándola con un mapa del metro de San Petersburgo. En este mapa decidimos designar embalses y puentes. Un poco más tarde, Yandex mostró un rediseño con un diseño similar de tarjetas. No está mal, pensamos.

En total, agregamos 10 ciudades: San Petersburgo, Barcelona, Praga, Bakú, Kazán, Kiev, Minsk, Nizhny Novgorod, Samara, Novosibirsk. En el desarrollo de un mapa del metro de París y Nueva York, los planes: todo el mundo.
En julio, se implementó un back-end para actualizar la información de la estación y actualizar rápidamente los mapas.
En septiembre, ya teníamos un producto fuerte que podía llevarse a las masas. Al mismo tiempo, nos reunimos con el desarrollador de la aplicación "Metro y MCC - diagramas de estación" Nikolai. En su aplicación, reunió diagramas de estaciones que le permiten navegar rápidamente y encontrar la salida deseada. Muy bueno, pero esta aplicación no permitía construir una ruta y tenía un diseño desactualizado. Y por lo tanto, para una audiencia amplia, resultó ser más débil que Yandex.Metro.
Acordamos implementar diseños de estaciones en nuestra aplicación, y la gerencia de la compañía apoyó y financió la idea. Se ha convertido en una característica asesina. Nuestros usuarios estaban encantados.
Enero - marzo 2019Después de realizar unos 10 experimentos con la página de la aplicación en Google Play y gastar 18 (!) Mil rublos para marketing, colocamos las aplicaciones en los 3 mejores juegos de Google a pedido del "metro" y "metro de Moscú".
En marzo, se publicó la versión iOS de la aplicación, que también se clasificó con éxito entre las 5 mejores tiendas de aplicaciones a pedido del Metro de Moscú.
Descargar Android: Metro de Moscú - diagramas de estación, rutas, salidasDescargar iOS: diagramas de la estación de Metro + de Moscú