其实一提到第三方的东西对于开发者来说 是最简单也是最头疼的东西,因为一扯到第三方就是一个集成问题,但集成完后要它实现我们所有的功能,毕竟不是我们自己的东西,难免会出现一系列问题。话不多说,总结了集成最简单的高德以及实现最简单的定位后的一些功能和问题。(建议把高德的一系列jar包更新到最新版)
1>高德自带的定位按钮问题:
我们都知道高德自带定位按钮功能 已经为我们封装好了只需要我们添加触发就可以:
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
有了定位点我们还需要设置自定义的定位点蓝点,捎带着粘上代码:
//设置loge的位置 mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT);//高德logo位置的移动 MyLocationStyle myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_move_map_path_dot)); myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));// 设置圆形的边框颜色 myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));// 设置圆形的填充颜色 aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
显示如图:(先看定位按钮和定位点图标,其他先忽略)
还有一些地图图标以及log放置的位置就不一一说了 在高德api都有提到,现在就说这定位的问题 当我们设置好的时候有个坑 就是地图的定位type默认是定一次位,简单的说效果就是我们想让地图一初始化完成后我们就设置地图的moveCamera移动到非洲但他只要一进入这个界面还是移动到定位点,于是我们就需要手动设置他的
LocationStyle了:aMap.setMyLocationStyle(myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW));//只显示出来不会移动视图
有以下几个类型:
就不一一介绍了 看字面意思应该也能推理出来。 在我们实际的开发过程中我们有时需要自己设置定位按钮的位置,高德没有给提供移动定位点图标的属性,所以我们这时只能自定义定位按钮 可以用一个button代替。可以参考实例:http://lbs.amap.com/api/android-sdk/guide/create-map/mylocation/。
2> 高德关键字搜索以及限制区域搜索。
可以用简单的InputtipsQuery关键字搜索关键代码如下:
InputtipsQuery inputquery= new InputtipsQuery("", "");//需要两个参数前面是搜索的内容 后面是限制的条件,可以填省市区的名字也可以传code码。inputquery.setCityLimit(true); Inputtips inputTips = new Inputtips(LocationAddress.this, inputquery); inputTips.setInputtipsListener(this); inputTips.requestInputtipsAsyn();之后在回调方法中接收值添加所需要的操作:public void onGetInputtips(final List<Tip> tipList, int rCode) {}另外还有:query = new PoiSearch.Query(keyWord, "", cityCode); //keyWord表示搜索字符串, //第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考POI分类码表(而非文字) //cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索。3> 地图缩放问题:我现在有几个点 但不确定在哪 假设有两个 一个在北京 另一个在河北 怎样计算地图的缩放让这两个点都显示出来 又或者一个在中国 一个在美国 怎样计算缩放比例让这两个点同时在地图上能显示出来。也就是说我有n个marker怎样让他完全显示在地图上 控制地图的缩放。如果一个点:您好,很抱歉现在才回复您, 您可以参考如下代码实现: LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(北京坐标点); builder.include(河北坐标点); aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 10));如果是两个或是多个点:您好,很抱歉现在才回复您, 您可以参考如下代码实现: 相同的道理只不过添加一个for循环添加就可以了LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder();//存放所有点的经纬度 for (int i = 0; i < serveOutletBean.rows.size(); i++) { Double latitude = Double.valueOf(serveOutletBean.rows.get(i).latitude); Double longitude = Double.valueOf(serveOutletBean.rows.get(i).longitude); LatLng latLng = new LatLng(latitude, longitude); latLngs.add(latLng); } for (LatLng latLng : latLngs) { boundsBuilder.include(latLng);//把所有点都include进去(LatLng类型) }aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(boundsBuilder.build(), 10));但是这里也有一个坑:高德地图组件的确是这样的, 不能设置wrap_content 属性, 如果不全屏的话,需要设置固定的高度来设置,这样SDK内部才能通过对应的高宽计算出中心点;如果指定wrap_content 在地图初始化时因没有渲染 是无法得到对应的高度来计算的,简单的说就是如果不设置死的高度高德地图就会按照可见的视图来进行缩放也就是缩放比例如果你的地图变化那么它就会跟这发生变化。在这添加一个知识点,当我们需要给marker添加点击事件的时候我们需要实现MarkerClickListener接口,而当我们需要给多个marker添加点击事件的时候我们就需要给marker添加一个标记:marker.setObject("");之后再点击监听方法里面得到这个标记来判断点击的是哪个marker。
行了就先说这几个小问题吧。