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; }
嗯。。好了。。差不多了。。。
相关推荐
总之,实现百度地图点击标注弹出窗口的功能,主要包括以下几个步骤:引入百度地图API、创建地图实例、创建标注点、创建信息窗口、监听标注点点击事件以及打开信息窗口。在实际开发中,可能还需要考虑性能优化、用户...
3. **marker窗口信息**:每个marker可以关联一个信息窗口(infowindow),当用户点击marker时,该窗口会弹出显示详细信息,如地点名称、地址或者其他自定义内容。开发者可以通过API设置marker的点击事件,并在事件...
在这个“百度地图点击标注,弹出窗口.rar”压缩包中,我们主要讨论的是如何在百度地图上实现点击标注点后弹出窗口的功能。这个功能常用于展示地图上的特定位置信息,如商店、公交站、景点等。 首先,我们需要了解...
4. **信息窗口(InfoWindow)**:InfoWindow是百度地图API提供的一种组件,用于在地图上弹出含有文本、图片等信息的浮动窗口。通过`openInfoWindow`方法可以打开信息窗口,而`close`方法则可以关闭它。信息窗口的...
本资源“安卓GPS地图导航定位指南相关-百度地图点击标注弹出窗口.rar”聚焦于百度地图API的使用,特别是点击地图上的标注点后弹出窗口的功能。下面将详细解析这一知识点。 首先,我们需要理解GPS地图导航定位的基本...
2. **InfoBox**:InfoBox是当用户点击Marker时弹出的可自定义信息窗口。它可以显示与Marker关联的详细信息,如地址、服务描述或其他相关数据。 **自定义Marker**: 要自定义Marker,你需要创建一个BMap.Marker对象...
在Android开发中,集成百度地图并实现点击标注后弹出窗口的功能是一项常见的需求。这个功能可以为用户提供更丰富的交互体验,比如展示详细信息或者执行特定操作。以下将详细讲解实现这一功能所需的知识点。 首先,...
本示例着重讲解如何在百度地图API中实现点击标注后弹出窗口的功能。这个压缩包“百度地图点击标注,弹出窗口.zip”应该包含了一个简单的Android项目,供开发者学习和参考。 首先,我们需要了解百度地图API。百度...
在安卓开发中,集成百度地图并实现点击标注后弹出窗口的功能是一项常见的需求。这个压缩包文件"安卓Android源码——百度地图点击标注,弹出窗口.rar"提供了一个示例项目,帮助开发者理解和实践这一功能。以下是关于...
在安卓(Android)开发中,集成百度地图API并实现点击地图上的标注点弹出窗口是一项常见的功能需求。这个压缩包“安卓Android源码——百度地图点击标注,弹出窗口.zip”提供了一个示例项目,帮助开发者理解如何在...
本项目“Android应用源码之百度地图点击标注,弹出窗口”聚焦于如何在百度地图上实现点击标注点后弹出信息窗口,这是地图应用中常见的交互设计,下面将详细解释这一过程。 1. **百度地图SDK集成**:首先,我们需要...
在IT行业中,地图应用开发是不可或缺的一部分,尤其是在Web开发领域。本话题主要关注的是如何...对于压缩包内的"百度地图点击标注,弹出窗口"文件,可能是包含完整示例代码的HTML和JavaScript文件,供开发者参考学习。
点击一个按钮“长沙市” 进去 希望在地图上显示出长沙市的一些符合规则的企业,当然是有很多个的,每个企业一个标注(就是一个红点),点击标注 弹出一个框 显示企业的详细信息。。 问题来了。。标注可以循环添加多个 ...
对于InfoWindow,它是当用户点击Marker时弹出的信息窗口。首先,你需要创建一个布局文件(如`info_window.xml`)来定义InfoWindow的外观。然后,创建一个`InfoWindow`对象,并在Marker被点击时显示: ```java ...
这个"应用源码之百度地图点击标注,弹出窗口.zip"文件包含了一个示例项目,展示了如何在用户点击地图上的标注时弹出一个信息窗口。通过分析这个源码,我们可以深入理解Android和百度地图API的交互过程。 首先,我们...
这个“Android高级应用源码-百度地图点击标注,弹出窗口.zip”文件很显然是一个示例项目,旨在教开发者如何在百度地图上实现点击标注后弹出窗口的功能。接下来,我们将深入探讨这个知识点。 首先,我们要了解百度...
例如,你可以创建一个Marker来表示某个店铺的位置,用户点击Marker时会弹出包含店铺信息的窗口。通过调整Marker的属性,可以实现个性化定制,使其符合应用的设计风格。 弧线,通常由百度地图API中的Polylines对象来...