1.总体设计
本系统主要是实现一个以自驾出行线路天气和景区信息为核心业务的移动端,随时随地为用户提供路线天气和旅游信息服务。用户在自驾游途中,打开应用可以查看“出发地—途径地—目的地”的天气情况,同时还提供美食信息,购物信息。本应用将这些信息以景点为基础联合起来。用户可以通过一个景点就获取到景点周边的美食、购物等信息,可以一站式的规划自己的出行安排。
本应用的主要分为:天气模块、出行模块、景点模块和实景模块。(如图1 所示)本应用由三个层次组成,分别为底层模块、支持模块和业务模块。本着依赖项规则:源码依赖项只能向上指向,上层里的所有项不能了解下层所发生的内容。
2.设计与实现
2.1 天气模块的设计与实现
天气模块本身是一个Fragment,基于产品原型图、用户体验的一致性和APK 框架的设计思想,使用了Fragment 内嵌套五个子Fragment 的形式去实现天气的子模块。各子模块的Fragment 的生命周期由自己把控,当Tab 切换到子模块上时,子模块开始执行自己的生命周期。
2.1.1 预报和实况模块
将布局文件和Fragment 类建立起映射,同时给布局上的控件和类里面的`控件对象建立绑定关系通过getJSON 方法从网络中获取天气预报和实况数据。在安卓4.0 版本及其以上的系统,为了防止网络这一耗时操作阻塞UI 的绘制。因此,新开线程异步地进行网络访问以获取服务器返回的JSON 对象。本应用中网络的访问均是通过这种模式去实现。
2.1.2 趋势图
趋势图使用画布类自行绘制,并提供API 修改趋势图的走向。天气趋势中的折线图其实现的难度在于,需要一个算法去计算折线上的点在屏幕上的位置,折线两点之间的度和计算文本的位置。本应用使用坡度系数这个值去定制折线。
2.1.2.1 通过屏幕的宽和所需要显示的点数计算出每一段折线X 轴投影的长度。float wOffset= ((float) this.getWidth() / (2 * topTem.length ‐ 1)) * 2;//X 轴投影长度
2.1.2.2 通过屏幕的高和坡度系数,以及要显示数据的最大值和最小值计算出中轴线。
2.1.3 分析图
安卓系统中内置了高性能的Webkit 浏览器,在SDK 中被封装成了WebView。首先通过网络模块提取URL,然后使用loadUrl()语句调用,即可在Webview 里面展示网页。
2.2 出行模块的设计与实现
2.2.1 路线管理
路线管理由路线列表和路线定制所组成,在一个FrameLayout 中写两个布局,通过设置布局的可见度,显示不同的布局。
在布局文件中,使用帧布局包裹两个相对布局,其中一个相对布局的可见度为隐藏。并在JAVA 代码中,对RadioButton 进行监听,当点击到其中一个时,路线查看界面隐藏,路线定制界面展示,反之亦然。
2.2.2 地图模块
天气的预报、实况、预警以及路线的实况都与地图有关,应用的地图使用百度地图SDK,通过其提供的API 进行路线的绘制,地图经纬度的采集。
自定义线路的实现:有两种形式,一是没有途径点的形式,一是有途经点的形式,没有途径点,即调用 drivingSearch(String strat, MKPlanNode node1, String end, MKPlanNode node2)方法就可以在地图上显示出路线了,如果拥有途经点,就调用它的一个重载方法—drivingSearch(String strat, MKPlanNode node1, String end, MKPlanNode node2,List nodes)
通过drivingSearch 方法我们可以在地图上展示出一条路线出来。路线的绘制,即在图上确认一系列的点,将这些点连接成线段,故可以得到起点城市、途经点城市和终点城市的经纬度,通过这些经纬度,我们在其Y轴的做出一定的偏移量,即可绘制出所需要展示的预报、实况和预警信息。
2.3 景点模块的设计与实现
2.3.1 景点导航模块
景点导航模块由三部分构成,一是热门景区列表,二是全国热门景区列表(按省分),三是景点搜索。
热门景区列表是一个ListView,用于展示热门景区,点击可以跳转到景点介绍,以及景点的吃住行购。
全国热门景点列表是结合百度地图SDK 来实现的,在省级缩放度的地图上,每一个省份在地图上的表现是一个Button,点击进去就可以看到该省份的热门城市。
2.3.2 吃住行购模块
该模块采用APK 框架,上方的Tab + 下面的Fragment。其中吃住购的实现相同,均是一排筛选器和一个ListView构成。行模块是基于百度地图SDK 的二次开发,展示景点的位置。筛选器有三个,分别是距离、类型和推荐度,采用了自定义Popup Window View 的方式实现。首先自定义一个View 类继承PopupWindow 和自定义的SpinnerAdapter,然后使用时,初始化,并填充数据。
2.4 实景模块的设计与实现
图片瀑布流,即图片如瀑布般依次展示在屏幕上。对图片进行分组,以宽度为定值限制图片大小,向布局中动态添加指定列数。
为了在图片瀑布流的内存使用一直保持在一个合理的范围,采用了LRU 内存缓存技术,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。