Android 百度地图 SDK v3.0.0 添加覆盖物Marker与InfoWindow的使用
我们先看效果图片:
我下载过 百度的 官网演示,感觉写的不是很详细。 我在开发的时候也磕磕碰碰的,注释也的很清楚了,下面是代码:
先看布局文件:
一: Fragment 碎片的布局文件 fragment_check_map:
<?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" > <!-- 百度地图的 MapView --> <com.baidu.mapapi.map.MapView android:id="@+id/mv_baidumap" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>
二: 我们点击 Marker 弹出窗口的布局文件 baidumap_infowindow:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg_infowindow" android:paddingTop="15dp" android:paddingBottom="30dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:orientation="vertical" > <TextView android:id="@+id/tv_entname" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="企业名称:样子嘻嘻嘻有限公司" /> <TextView android:id="@+id/tv_checkdept" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="检查部门:安监局" /> <TextView android:id="@+id/tv_checkuser" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="检查人员:啊嘎嘎嘎" /> <TextView android:id="@+id/tv_checktime" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="检查时间:2016-01-09" /> </LinearLayout>
下面的代码:
import java.util.ArrayList; import java.util.List; import android.app.ProgressDialog; import android.content.res.Configuration; import android.graphics.Point; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; import com.baidu.mapapi.map.BaiduMapOptions; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.SupportMapFragment; import com.baidu.mapapi.model.LatLng; import com.topinfo.app.commons.dialog.DialogUtils; import com.topinfo.app.utils.JSONUtils; import com.topinfo.app.utils.ProgressDialogUtils; import com.topinfo.app.utils.StringUtils; import com.topinfo.safetylead.R; import com.topinfo.safetylead.asynctask.AsyncCheckMap; import com.topinfo.safetylead.bean.CheckRecordBean; /** *@Description: 检查 地图 *@Author:杨攀 *@Since:2016年1月18日下午1:49:05 */ public class CheckMapFragment extends Fragment { private static final int REQUEST_CHECKMAP = 200; private View rootview; private ProgressDialog mDialog; private Handler mHandler; private MapView mapView = null; private SupportMapFragment map; private BaiduMap mBaiduMap; private BitmapDescriptor descriptor; /** *@Fields mInfoWindow : 弹出的窗口 */ private InfoWindow mInfoWindow; private LinearLayout baidumap_infowindow; private MarkerOnInfoWindowClickListener markerListener; private void initView(View rootView){ mapView = (MapView) rootView.findViewById (R.id.mv_baidumap); baidumap_infowindow = (LinearLayout) LayoutInflater.from (getActivity ()).inflate (R.layout.baidumap_infowindow, null); // 构建Marker图标 descriptor = BitmapDescriptorFactory.fromResource (R.drawable.icon_point); mHandler = new AsyncHandler (); } private void initMap(){ // 获取BaiduMap类 BaiduMap类才可以添加自定义的图层 mBaiduMap = mapView.getMap (); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo (14.0f); mBaiduMap.setMapStatus (msu); markerListener = new MarkerOnInfoWindowClickListener (); //对Marker的点击事件 mBaiduMap.setOnMarkerClickListener (new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker){ //获得marker中的数据 CheckRecordBean bean = (CheckRecordBean) marker.getExtraInfo ().get ("marker"); createInfoWindow(baidumap_infowindow, bean); //将marker所在的经纬度的信息转化成屏幕上的坐标 final LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow (BitmapDescriptorFactory.fromView (baidumap_infowindow), ll, -47, markerListener); //显示InfoWindow mBaiduMap.showInfoWindow(mInfoWindow); return true; } }); } private void initData(){ mDialog = ProgressDialogUtils.showProgressDialog (getActivity (), R.string.progress_title, R.string.progress_message); AsyncCheckMap checkMap = new AsyncCheckMap (getActivity (),mDialog,mHandler,REQUEST_CHECKMAP); checkMap.execute (); } private final class MarkerOnInfoWindowClickListener implements OnInfoWindowClickListener{ @Override public void onInfoWindowClick(){ //隐藏InfoWindow mBaiduMap.hideInfoWindow(); } } /** *@Description: 创建 弹出窗口 *@Author:杨攀 *@Since: 2016年1月20日上午11:18:33 *@param baidumap_infowindow *@param bean */ private void createInfoWindow(LinearLayout baidumap_infowindow,CheckRecordBean bean){ InfoWindowHolder holder = null; if(baidumap_infowindow.getTag () == null){ holder = new InfoWindowHolder (); holder.tv_entname = (TextView) baidumap_infowindow.findViewById (R.id.tv_entname); holder.tv_checkdept = (TextView) baidumap_infowindow.findViewById (R.id.tv_checkdept); holder.tv_checkuser = (TextView) baidumap_infowindow.findViewById (R.id.tv_checkuser); holder.tv_checktime = (TextView) baidumap_infowindow.findViewById (R.id.tv_checktime); baidumap_infowindow.setTag (holder); } holder = (InfoWindowHolder) baidumap_infowindow.getTag (); holder.tv_entname.setText (String.format (getString (R.string.checkmap_entname_format), bean.getEntName ())); holder.tv_checkdept.setText (String.format (getString (R.string.checkmap_checkdept_format), bean.getRemark1 ())); holder.tv_checkuser.setText (String.format (getString (R.string.checkmap_checkuser_format), bean.getCheckUserNames ())); holder.tv_checktime.setText (String.format (getString (R.string.checkmap_checktime_format), bean.getCheckTime ())); } @Override public void onStart(){ super.onStart (); initMap (); test (); } @Override public void onResume(){ // MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume() mapView.onResume (); super.onResume (); } private final class AsyncHandler extends Handler { @Override public void handleMessage(Message msg){ String result = (String) msg.obj; switch (msg.what) { case REQUEST_CHECKMAP:// 检查地图 List<CheckRecordBean> list = JSONUtils.parseArray (result, CheckRecordBean.class); if (list != null) { showData (list); } else { DialogUtils.showDialog (getActivity (), R.string.app_serviceReturnError); } break; } } } private void test(){ List<CheckRecordBean> list = new ArrayList<CheckRecordBean> (); CheckRecordBean bean = new CheckRecordBean (); bean.setEntName ("杭州鸿雁电器有限公司"); bean.setCheckTime ("2015-09-19"); bean.setCheckUserNames ("杨攀"); bean.setRemark1 ("综合科"); bean.setCheckX ("39.963175"); bean.setCheckY ("116.400244"); list.add (bean); CheckRecordBean bean2 = new CheckRecordBean (); bean2.setEntName ("杭州图讯科技有限公司"); bean2.setCheckTime ("2015-09-19"); bean2.setCheckUserNames ("赵云"); bean2.setRemark1 ("管理科"); bean2.setCheckX ("39.962173"); bean2.setCheckY ("116.410294"); list.add (bean2); showData (list); } /** *@Description: 显示 数据 *@Author:杨攀 *@Since: 2016年1月20日上午10:33:39 *@param list */ private void showData(List<CheckRecordBean> list){ mBaiduMap.clear (); addMarker (list); } /** *@Description: 添加 标记 *@Author:杨攀 *@Since: 2016年1月20日上午10:34:17 *@param list */ private void addMarker(List<CheckRecordBean> list){ for ( int i = 0 ; i < list.size () ; i++ ) { CheckRecordBean bean = list.get (i); // 经度 double longitude = parseLatLng (bean.getCheckY ()); // 纬度 double latitude = parseLatLng (bean.getCheckX ()); if (longitude > 0 && latitude > 0) { // 定义Maker坐标点 LatLng ll = new LatLng (latitude,longitude); // 构建MarkerOption,用于在地图上添加Marker MarkerOptions options = new MarkerOptions ().position (ll).icon (descriptor); // 在地图上添加Marker,并显示 Marker marker = (Marker) mBaiduMap.addOverlay (options); // 将信息保存 Bundle bundle = new Bundle (); bundle.putSerializable ("marker", bean); marker.setExtraInfo (bundle); if (i == 0) { // 把第一个默认为当前的位置图层 MapStatusUpdate u = MapStatusUpdateFactory.newLatLng (ll); mBaiduMap.setMapStatus (u); } } } } private double parseLatLng(String latlng){ if (StringUtils.isNotEmpty (latlng)) { return Double.parseDouble (latlng); } return -1; } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged (newConfig); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ // 在使用这个view之前首先判断其是否存在parent view,这调用getParent()方法可以实现。 // 如果存在parent view,那么就调用removeAllViewsInLayout()方法 /*-ViewGroup perentView = (ViewGroup) rootview.getParent (); if (perentView != null) { perentView.removeAllViewsInLayout (); }*/ rootview = LayoutInflater.from (getActivity ()).inflate (R.layout.fragment_check_map, null); initView (rootview); // initData (); return rootview; } @Override public void onDestroy(){ mapView.onDestroy (); mapView = null; super.onDestroy (); } }
复用弹出面板mMarkerLy的控件:
import android.widget.TextView; /** *@Description: 复用弹出面板mMarkerLy的控件 *@Author:杨攀 *@Since:2016年1月20日上午11:05:30 */ public class InfoWindowHolder { public TextView tv_entname; public TextView tv_checkdept; public TextView tv_checkuser; public TextView tv_checktime; }
嗯。。好了。。差不多了。。。