android 百度地图API 使用Marker和InfoWindow

前言:在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

android 百度地图API 使用Marker和InfoWindow的相关文章

android百度地图 添加覆盖物Marker与InfoWindow的使用

如何添加覆盖物,实现周边搜索,以及对覆盖物的点击出现介绍等效果. 效果图: 我们的需求是,当用户点击衣食住行,或者对对附近搜索是,从服务器返回数据(经纬度,商家信息,介绍等),然后动态生成覆盖物,实现上述效果.关于图片,由于手机上的内存的有限性,所有的图片下载完成都应该存入预设的缓存中,例如LruCache,然后需要的时候从缓存取,缓存没有,下载完成放入缓存:即实现所有的图片所占的内存永远不会超过缓存预设的内存值,当然了本篇的重点不是这个,我直接拿了几张图片加入我们的项目中模拟. 1.承载数据的

Android百度地图API集成二《定位》

书接上回 ↑ 基础地图请查看Android百度地图API集成一<基础地图>: 地址http://www.cnblogs.com/dhr125/p/5969980.html 1.在Application标签中声明SERVICE组件 <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> <

Android 百度地图API 定位 导航

看看这个利用百度地图定位并实现目的地导航的Demo.首先看实现效果:                          进 入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路. 步行线路,在代码中都有详细注释.另外,在控制台还输出了线路上每一个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息.如下 图: 接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料

android 百度地图API使用教程说明

导入库文件 在下载页面下载最新的库文件.将liblocSDK2.4.so文件拷贝到libs/armeabi目录下.将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性->Java Build Path->Libraries中选择"Add JARs",选定locSDK2.4.jar,确定后返回.这样您就可以在程序中使用百度定位API了. 设置AndroidManifest.xml 为区分2.3版本service,需要将manifest file中的 intent

Android百度地图API集成三《搜索》

书接上回↑ 一.基础地图界面地址:http://www.cnblogs.com/dhr125/p/5969980.html 二.地图定位地址:http://www.cnblogs.com/dhr125/p/5970118.html 搜索功能 1.在xml文件中加入布局 1 <LinearLayout 2 android:layout_width="match_parent" 3 android:layout_height="wrap_content">

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终

调用百度地图API添加点聚合时,marker标注的label标签刷新丢失问题

最近在使用百度地图API的点聚合时遇到一个问题 当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合API<script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_mi

记录Android端百度地图API使用遇到的问题

折腾了两三个夜晚,终于实现了百度地图在Android端的显示: 在这里主要总结记录一下百度地图API在Win 10 下的Android Studio中使用遇到的问题: 1.查看本机android或app的SHA1值 SHA1值用来在百度开发者控制台创建应用使用~~ 我的电脑是Win10系统,安装Android Studio的时候也没有配置jdk环境变量这些,所以在查看SHA1值得时候遇到一些问题,百度官方提供的方法是通过cmd控制台命令查看,“keytool -list -v -keystore