高德地图自定义POI的样式

 前段时间在开发一个地图相关的软件,本来要实现Poi搜索完成后的高亮,类似高德官方的地图,如下图:

高德地图自定义POI的样式_第1张图片

 

 

用高德的API一直不得要领,没办法,只好自己重新按marker的方法来实现,然后就没有用高德API提供的POI搜索类。下面贴出部分代码, /** * 目的地异步搜索 */@Overridepublic void onPoiSearched(PoiResult result, int rCode) {// TODO Auto-generated method stubloading.dismiss();// 隐藏对话框searchCount.setVisibility(View.GONE);if (rCode == 0) {if (result != null && result.getQuery() != null) {// 搜索poi的结果if (result.getQuery().equals(query)) {// 是否是同一条poiResult = result;// 取得搜索到的poiitems有多少页poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始List suggestionCities = poiResult.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息Log.d(TAG, "poiItems---->" + poiItems.toString());if (poiItems != null && poiItems.size() > 0) {aMap.clear();/*注释掉高德原有的PoiOverlay*/// PoiOverlay poiOverlay = new PoiOverlay(aMap,// poiItems);/*poiOverlay = new MyOverlay(aMap, poiItems);poiOverlay.removeFromMap();poiOverlay.addToMap();poiOverlay.zoomToSpan();*/addPoiToMap(poiItems);geoLat = poiItems.get(0).getLatLonPoint().getLatitude();geoLng = poiItems.get(0).getLatLonPoint().getLongitude();aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(geoLat,geoLng), 19.5f));//showPoiMsg(poiItems);Log.d(TAG, "mTarget---->" + mTarget);search_flag = 1;} else if (suggestionCities != null&& suggestionCities.size() > 0) {ToastUtil.show(MainActivity.this, R.string.search_error);} else {ToastUtil.show(MainActivity.this, R.string.no_result);}}} else {ToastUtil.show(MainActivity.this, R.string.no_result);}} else if (rCode == 27) {ToastUtil.show(MainActivity.this, R.string.error_network);} else if (rCode == 32) {ToastUtil.show(MainActivity.this, R.string.error_key);} else if (rCode == 31) {ToastUtil.show(MainActivity.this, "只能搜索到当前城市停车场信息!");} else {ToastUtil.show(MainActivity.this, getString(R.string.error_other)+ rCode);}}

      这里就不用高德本身的API,自己写了个addPoiToMap的方法然后通过marker的方式直接往地图上面 private void addPoiToMap(List list) {// TODO Auto-generated method stublistMarkers.clear();for(int i = 0 ; i < list.size(); i++ ){MarkerOptions markerOption = new MarkerOptions();markerOption.position(new LatLng(list.get(i).getLatLonPoint().getLatitude(), list.get(i).getLatLonPoint().getLongitude())).icon(ImageNormal(i+1)).title(i+1+"、"+list.get(i).getTitle()).snippet(list.get(i).getSnippet());listMarkers.add(aMap.addMarker(markerOption));}listMarkers.get(0).setIcon(ImagePress(1));tempMarker = listMarkers.get(0);tempIndex = 1;}

 

然后添加自定义图片,这种自定义的添加比复写PoiOverlay的方式好的多,灵活度比高 private BitmapDescriptor ImageNormal(int i) {View view = null;view = getLayoutInflater().inflate(R.layout.poi_view, null);LinearLayout ly = (LinearLayout) view.findViewById(R.id.poplayout);TextView tv = (TextView) view.findViewById(R.id.poi_mark_img);tv.setText(i + "");Log.d(TAG, "ImageNormal=======>" + i);tv.setPadding(0, 0, 0, 25);tv.setBackgroundResource(R.drawable.poi_mark_normal);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);return bitmap;}private BitmapDescriptor ImagePress(int i) {View view = null;Log.d(TAG, "imagePress--->");view = getLayoutInflater().inflate(R.layout.poi_view, null);TextView tv = (TextView) view.findViewById(R.id.poi_mark_img);tv.setText(i + "");tv.setPadding(0, 0, 0, 25);Log.d(TAG, "imagePress-iii-->" + i);tv.setBackgroundResource(R.drawable.poi_mark_press);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);return bitmap;}

 

然后在maker被点击的时候做处理

@Overridepublic boolean onMarkerClick(Marker marker) {// TODO Auto-generated method stubImageFat(marker ,listMarkers.indexOf(marker)+1);return false;} 

private void ImageFat(Marker marker , int i) {Log.d(TAG,"i--->"+i);if (tempIndex == i) {Log.d(TAG,"if--->");marker.setIcon(ImagePress(i));tempMarker = marker;} else {Log.d(TAG,"else--->");tempMarker.setIcon(ImageNormal(tempIndex));tempIndex = i;tempMarker = marker;Log.d(TAG,"else--->tempIndex "+tempIndex);marker.setIcon(ImagePress(i));}} 

 

因为自定义了一个List<Marker> listMarkers,用这个listMarkers来装载所有的poi marker,每次点击的时候通过listMarkers.indexOf方法来确定被点击marker的位置,然后用一个int的变量temp来记录上一次点击的位置,完成后的效果如下

高德地图自定义POI的样式_第2张图片

 

因为是个大工程,源码不好打包上传,大家看看代码就行了。总觉得这样做有点奇葩,如有更好的办法希望大家指点下!

 

你可能感兴趣的:(高德地图自定义POI的样式)