Android版莫斯科地铁和全世界的地图

第1章野心


2018年2月底



作为自由软件和自由市场思想的拥护者,我们认为垄断是有害的。

大量的人需要在地铁中方便快捷地导航。 奇怪的是Yandex.Metro应用程序没有一个值得竞争的人。 我们决定自己创建它,并在业余时间以业余爱好来完成它。

团队:在2至4人的不同时间。

故事只涉及Android应用程序,因为它首先启动并且所有基本机制都在其上运行。 当然,iOS版本当前可用。

第二章黑暗中的路线


2018年3月-6月。

需要一张地图。 我们采用SVG,将其推入SVGView中 ,一切都很好。 撒谎,但是我们很高兴。 如何绘制单独的路线? 没有人知道。

在SVG格式中,没有关于分层的信息,元素是属于任何线还是其他对于构建路线至关重要的信息。 因此,我们开始使用数据库来存储所有要渲染的元素。

另外,我们需要该应用程序尽快运行。 使用WebView会立即消失,您需要GL曲面。 我们决定使用SurfaceView (可以用作画布的opengl表面)进行尝试-并非如此。 它可以在自己内部进行更改,并以黑色闪烁,因为它的实现方式很差,并且不能承受比渲染20x20多维数据集更多的负载。 它可以增加,一次消失。 我们需要一个不同的解决方案,但是离SurfaceView不会有什么距离,因为它完全适合我们在界面上使用。

图片
简要介绍Android驱动程序错误

我们在TextureView上尝试了一个实现。 而且,天哪,大多数问题都消失了。 尽管TextureView是类固醇上的SurfaceView,但通常在实现时不会出现魔术错误和视频适配器癫痫发作的情况。

在同步流和调整视图时,仍然存在错误(无法读取的分段错误),但这要好于闪烁的黑色点。 因此,对View的任何不当使用都会强制重新定义View本身的几乎所有方法。 对于TextureView,这尤其成问题,因为该组件由两部分组成:View和Surface。 他们彼此之间无法生存,但同时他们根本无法在View内部发送Surface死亡事件,这就是为什么您几乎必须在每次操作后都进行手动检查的原因。

当我们不得不增加视野时,问题就开始了。 Canvas会逐像素绘制所有内容,因此,如果我们指定大小为400x400,则0到400之间的元素将可见,但外部则不可见。 400很小,实际上我们需要在优质设备上绘制约5000x5600像素的地图。 但是如何在1920x1080(16:9)屏幕上放置5000x5600?

我们创建一个画布地图,其大小和比例将随着屏幕分辨率的增加而增加,并随着屏幕分辨率的降低而减小。 因此,我们解决了在具有大屏幕的设备上绘制非常大且弯曲的地图,而在小屏幕上绘制太小的地图的问题。

当我们开始测试卡时,事实证明,在具有相同分辨率的手机上,卡的显示方式有所不同。 嗯,与此不同:在一个显示它,在第二个显示白点/黑点。 日志会导致高通错误跟踪器检测到Adreno 330/300芯片处于“ wontfix”状态的错误。 太好了

克服此错误的唯一方法是低估具有特定视频芯片的手机上卡的大小,以致没有白色正方形代替卡。 但是,我们如何知道视频芯片的型号? 启动应用程序时,我们需要创建一个大小为1x1像素的GLSurfaceView,从中获取有关视频芯片的信息,然后才绘制地图。

“-但这是拐杖。” 是的,这是拐杖。 这是一个银河系的拐杖,但比削减大量设备并希望高通公司希望修复其驱动程序的错误并将更新发送给所有OEM更好,这样我们可以在具有这些弯曲驱动程序的手机上使用该卡。 多亏了我们的用户,我们才能找到适用于所有设备的解决方案。

图片
我们建造,建造并最终建造!

同样非常有趣的任务是元素的分层。 由于应该在绿色的顶部绘制红色分支,在蓝色的顶部绘制绿色,在红色的顶部绘制黄色,等等,因此,我们输入了层号,我们的应用程序(乍看之下很简单)类似于Adobe Photoshop :)

决定如何绘制路线。 现在有必要决定如何在其中找到最好的。 为了找到顶点之间的所有路径,我们使用Floyd-Warshall算法,找到最短的路径,我们使用Dijkstra算法,用于选择Yen算法的替代路径。 任何对细节感兴趣的人都可以在评论中提问。

第三章阳光下的路线


六月-十二月2018

在这个阶段,我们已经知道该怎么做。 改善产品。 我们绘制了新的地图,添加了新的语言,修复了错误,加快了工作速度,拧紧了功能,收集了自定义反馈,并且没有花一毛钱来推广应用程序。

6月15日,我们推出了该版本的应用程序,并为其添加了圣彼得堡地铁地图。 在此地图上,我们决定指定水库和桥梁。 不久之后,Yandex展示了重新设计的类似卡片布局。 不错,我们认为。

图片

我们总共增加了10个城市:圣彼得堡,巴塞罗那,布拉格,巴库,喀山,基辅,明斯克,下诺夫哥罗德,萨马拉,新西伯利亚。 在制作巴黎和纽约的地铁地图时,计划-整个世界。

7月,部署了一个后端以更新站信息并快速更新地图。

到了9月,我们已经有了可以推向大众的强大产品。 同时,我们与“地铁和MCC-站图”应用程序Nikolai的开发人员会面。 在他的应用程序中,他组装了车站图,使您可以快速导航并找到所需的出口。 非常酷,但是此应用程序不允许构建路线,并且设计过时。 因此,对于广大的受众来说,它比Yandex.Metro弱。
我们同意在应用程序中实施站点设计,并且公司管理层支持并资助了该想法。 它已成为功能杀手。 我们的用户感到非常兴奋。

一月至三月2019

在Google Play上的应用程序页面进行了约10次实验并花费了18(!)千卢布用于营销之后,我们根据“地铁”和“莫斯科地铁”的要求将应用程序列为Google Play的前3名。

3月,发布了该应用程序的iOS版本,并应Moscow Metro的要求,该应用程序也成功跻身应用程序商店的前5名。

下载Android:莫斯科地铁-车站图,路线,出口
下载iOS:莫斯科地铁+车站图

Source: https://habr.com/ru/post/zh-CN459684/


All Articles