前言:在android开发过程中,百度地图的使用是比较普遍的,但是如何使用,使用什么版本的百度API还是需要一些讲究。
在项目过程中,需要用到百度地图的marker和InfoWindow的功能。
标注覆盖物(百度地图官方图)
布局文件很简单,主要就是mapview,如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/overall_bg"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/gps_button_reset" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/gps_reset_button" android:layout_marginBottom="8dp" android:layout_marginLeft="16dp" android:layout_marginTop="8dp" android:layout_marginRight="16dp" /> <Button android:id="@+id/gps_button_history" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/gps_history_button" android:layout_marginBottom="8dp" android:layout_marginLeft="16dp" android:layout_marginTop="8dp" android:layout_marginRight="16dp" /> </LinearLayout> <include layout="@layout/separate_line" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/gps_text" android:paddingBottom="8dp" android:paddingTop="8dp" android:textSize="15sp" android:layout_gravity="center" android:gravity="center" /> <include layout="@layout/separate_line" /> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
标注覆盖物实现代码如下:
/** * 根据手表的经纬度在地图上设置位置,更新顶部的位置文字描述 */ private void updateLocation(ArrayList<GPSBean> list) { /** * 1. 新用户默认显示地址 */ double lg = 104.06; // 成都市的经纬度 double lt = 30.67; String location = getResources().getString(R.string.fake_position); baiduMap.clear(); List<LatLng> potions = new ArrayList<>(); for(int i = list.size() -1; i >=0 ; i--){ // gps 非空,则设置经纬度、位置的文字描述 lg = Double.parseDouble(list.get(i).getLongitude()); lt = Double.parseDouble(list.get(i).getLatitude()); location = list.get(i).getAddress(); //地址太长,处理下 location = location.replace("四川省","").replace("成都市","").replace(".",""); final LatLng ll = new LatLng(lt, lg); // 注意经纬度顺序 /** * 为每个足迹依据先后顺序编号 */ int image_id = 0; switch (i){ case 9: image_id = R.mipmap.icon_mark1;break; case 8: image_id = R.mipmap.icon_mark2;break; case 7: image_id = R.mipmap.icon_mark3;break; case 6: image_id = R.mipmap.icon_mark4;break; case 5: image_id = R.mipmap.icon_mark5;break; case 4: image_id = R.mipmap.icon_mark6;break; case 3: image_id = R.mipmap.icon_mark7;break; case 2: image_id = R.mipmap.icon_mark8;break; case 1: image_id = R.mipmap.icon_mark9;break; case 0: image_id = R.mipmap.icon_mark10;break; } BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(image_id); OverlayOptions options = new MarkerOptions().position(ll).icon(descriptor).zIndex(i); Marker marker = (Marker) baiduMap.addOverlay(options); //为marker添加识别标记信息 Bundle bundle = new Bundle(); bundle.putSerializable("info", list.get(i)); marker.setExtraInfo(bundle); MapStatusUpdate update = MapStatusUpdateFactory.newLatLngZoom(ll,17); baiduMap.setMapStatus(update); }
为标记的marker添加监听,点击时实现弹出infowindow。(infowindow每次最多显示一条信息)
/** * 为标记添加监听 * 点击弹出地理位置信息 */ baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // 获得marker中的数据 GPSBean info = (GPSBean) marker.getExtraInfo().get("info"); // 生成一个TextView用户在地图中显示InfoWindow TextView location = new TextView(getApplicationContext()); location.setBackgroundResource(R.mipmap.gps_button); location.setPadding(15, 15, 8, 35); location.setTextColor(Color.DKGRAY); location.setText("定位时间:" + info.getUploadTime() + "\n" + info.getAddress()); location.setTextSize(12); // 将marker所在的经纬度的信息转化成屏幕上的坐标 final LatLng ll = marker.getPosition(); Point p = baiduMap.getProjection().toScreenLocation(ll); p.y -= 47; LatLng llInfo = baiduMap.getProjection().fromScreenLocation(p); // 为弹出的InfoWindow添加点击事件 mInfoWindow = new InfoWindow(location,llInfo, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { baiduMap.hideInfoWindow(); } }); // 显示最后一条的InfoWindow baiduMap.showInfoWindow(mInfoWindow); return true; } });
最后将地图显示到最新的数据,并且显示Infowindow。
/** * 显示最后一个地理位置信息 * 创建InfoWindow展示的view */ private void updateBaidumapInfowindown(String location,double lt, double lg){ TextView textView = new TextView(getApplicationContext()); textView.setBackgroundResource(R.mipmap.gps_button); textView.setPadding(15, 15, 8, 35); textView.setTextColor(Color.DKGRAY); textView.setText(location); textView.setTextSize(12); final LatLng ll = new LatLng(lt,lg); mInfoWindow = new InfoWindow(textView, ll, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { baiduMap.hideInfoWindow(); } }); //显示InfoWindow baiduMap.showInfoWindow(mInfoWindow); /** * 将地图视野移动最新的位置 */ MapStatusUpdate update = MapStatusUpdateFactory.newLatLngZoom(ll,17); baiduMap.setMapStatus(update); }
至此可以完成。但是还有最重要的一点,则是百度Api版本的问题,本方法在新版本 3.4.1 似乎就不能用这种方法实现,只能使用3.0.0版本。
实现的百度Api版本下载:http://download.csdn.net/detail/xygy8860/894
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-08 00:12:37