前言

上一篇讲解并实践了百度地图基本显示,地图类型,实时交通图,热力图,地图控制和手势控制,今天看下在地图上添加view和覆盖物。

地图Logo不允许遮挡,可通过mBaiduMap.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);方法可以设置地图边界区域,来避免UI遮挡。

其中参数paddingLeft、paddingTop、paddingRight、paddingBottom参数表示距离屏幕边框的左、上、右、下边距的距离,单位为屏幕坐标的像素密度。

—————–>利用这个来添加自定义的内容

  • 标注覆盖物
  • 几何图形覆盖物
  • 文字覆盖物
  • 弹出窗覆盖物

内容

地图上添加View

由于地图的Logo不允许被遮挡,百度自然会想办法针对一些开发者场景作出自己的调整,比如上面所说的setPadding()或者setViewPadding()一样好使,具体的使用分为两步:

第一步,

  1. mBaiduMap.setPadding(0, 0, 0, 200);

第二步,

  1. private void addView() {
  2. TextView textView = new TextView(this);
  3. textView.setText("这是用户自定义的View,这个时候logo和底部的一些内容会向上移动,因为MapView设置了底部Padding");
  4. textView.setBackgroundResource(R.color.colorPrimary); //创建一个TextView然后往底部放置,官方Demo如是操作
  5. MapViewLayoutParams.Builder builder = new MapViewLayoutParams.Builder();
  6. builder.layoutMode(MapViewLayoutParams.ELayoutMode.absoluteMode);
  7. builder.width(bmapView.getWidth());
  8. builder.height(200);
  9. builder.point(new Point(0, bmapView.getHeight()));
  10. builder.align(MapViewLayoutParams.ALIGN_LEFT, MapViewLayoutParams.ALIGN_BOTTOM);
  11. bmapView.addView(textView, builder.build());
  12. }

这样子就在底部添加了一个TextView,当然想添加其他的View自然也是可行的,具体效果图往下看。


地理编码,标注覆盖物和弹出窗覆盖物

利用标注覆盖物在地图上的特定位置添加标注,然后给标注覆盖物设置点击监听展示弹出覆盖物

  1. //这个是“打点”按钮的点击事件,点击事件发生后,地理编码对象执行Address->location的解析,解析结果返回之后,拿到对应的点的经纬度,也就是LatLng实例和对应的地址信息,然后执行addMarker操作
  2. private void addPointByEditText() {
  3. String placename = etPoint.getText().toString();
  4. final GeoCoder geo = GeoCoder.newInstance();
  5. geo.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
  6. @Override
  7. public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
  8. if (geoCodeResult.getLocation() != null) {
  9. addMarker(geoCodeResult.getLocation() , geoCodeResult.getAddress());
  10. //addText(geoCodeResult.getLocation(), "看过来 :" + geoCodeResult.getAddress());//这个是后面添加文字覆盖物的时候使用到的
  11. } else {
  12. Toast.makeText(MainActivity.this, " No Result of GeoCoder! Sorry", Toast.LENGTH_SHORT).show();
  13. }
  14. }
  15. @Override
  16. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
  17. }
  18. });
  19. geo.geocode(new GeoCodeOption().address(placename).city(placename));
  20. }
  21. ......
  22. //添加标注物
  23. private void addMarker(LatLng point, String address) {
  24. //定义Maker坐标点
  25. //LatLng point = new LatLng(39.963175, 116.400244);
  26. //构建MarkerOption,用于在地图上添加Marker
  27. Bundle bundle = new Bundle();
  28. bundle.putParcelable("LATLNG", point);//传递Bundle对象,方便后面读取对应的info来创建pop window
  29. bundle.putString("ADDRESS", address);
  30. OverlayOptions option = new MarkerOptions()
  31. .position(point)
  32. .icon(bitmap).extraInfo(bundle);
  33. //在地图上添加Marker,并显示
  34. mBaiduMap.addOverlay(option);
  35. }
  36. //设置标注覆盖物的点击事件监听
  37. mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
  38. @Override
  39. public boolean onMarkerClick(Marker marker) {
  40. //这里是MarkerOption创建的时候传入的点坐标和对应的地址信息
  41. if (marker.getExtraInfo() != null) {
  42. LatLng point = marker.getExtraInfo().getParcelable("LATLNG");
  43. String address = marker.getExtraInfo().getString("ADDRESS");
  44. addPop(point, address);
  45. }
  46. return false;
  47. }
  48. });
  49. ......
  50. //添加弹出窗覆盖物
  51. private void addPop(LatLng point, String message) {
  52. //创建InfoWindow展示的view
  53. Button button = new Button(getApplicationContext());
  54. button.setBackgroundResource(R.drawable.marker_info_bg);
  55. button.setTextColor(Color.WHITE);
  56. button.setText(message);
  57. //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
  58. InfoWindow mInfoWindow = new InfoWindow(button, point, -47);
  59. //显示InfoWindow
  60. mBaiduMap.showInfoWindow(mInfoWindow);
  61. }

实际效果图:


文字覆盖物

文字覆盖物主要就是在地图上添加一些字串, 用上面的代码,将标注覆盖物改成文字覆盖物

  1. //设置文字覆盖物
  2. private void addText(LatLng point, String message) {
  3. //构建文字Option对象,用于在地图上添加文字
  4. OverlayOptions textOption = new TextOptions()
  5. .bgColor(0xAAFFFF00)
  6. .fontSize(35)
  7. .fontColor(0xFFFF00FF)
  8. .text(message)
  9. .rotate(-30)
  10. .position(point);
  11. //在地图上添加该文字对象并显示
  12. mBaiduMap.addOverlay(textOption);
  13. }

实际效果图:


行政区边界搜索和多边形覆盖物

利用DistrictSearch和PolyOverlay,实现圈出行政区域的效果

  1. mDistrictSearch = DistrictSearch.newInstance();//创建行政区域查询的实例
  2. ......
  3. //添加多边形区域
  4. private void addPoly(String cityname) {
  5. //建立搜索条件
  6. DistrictSearchOption option = new DistrictSearchOption().cityName(cityname).districtName(cityname);
  7. //设置搜索监听事件
  8. mDistrictSearch.setOnDistrictSearchListener(new OnGetDistricSearchResultListener() {
  9. @Override
  10. public void onGetDistrictResult(DistrictResult districtResult) {
  11. if (districtResult.error == SearchResult.ERRORNO.NO_ERROR) {
  12. List<List<LatLng>> pointsList = districtResult.getPolylines();
  13. if (pointsList == null) return;
  14. //地理边界对象
  15. LatLngBounds.Builder builder = new LatLngBounds.Builder();
  16. for (List<LatLng> polyline : pointsList) {
  17. OverlayOptions ooPolyline11 = new PolylineOptions().width(10)
  18. .points(polyline).dottedLine(true).color(Color.RED);
  19. mBaiduMap.addOverlay(ooPolyline11);//添加OverLay
  20. OverlayOptions ooPolygon = new PolygonOptions().points(polyline)
  21. .stroke(new Stroke(5, 0xAA00FF88)).fillColor(0xAAFFFF00);
  22. mBaiduMap.addOverlay(ooPolygon);//添加OverLay
  23. for (LatLng latLng : polyline) {
  24. builder.include(latLng);//包含这些点
  25. }
  26. }
  27. }
  28. }
  29. });
  30. mDistrictSearch.searchDistrict(option);//执行行政区域的搜索
  31. }

实际效果图:

备注

今天先看到这里,有时间接着跟~

<Android 应用 之路> 百度地图API使用(3)的更多相关文章

  1. <Android 应用 之路> 百度地图API使用(2)

    简介 上一篇只是大致的提一下百度地图API的Android SDK的基本内容,然后抄袭一个官网上的Demo,今天看一下百度地图的第一部分,地图类型和基本的显示. 简单实战 不同类型地图的显示 //设置 ...

  2. <Android 应用 之路> 百度地图API使用(4)

    前言 百度地图的定位功能和基础地图功能是分开的,使用的是另外的jar包和so库文件,详情请关注官网: 百度定位SDK 配置 下载对应的jar包和so库,然后移动到lib目录下 AS中注意事项 sour ...

  3. <Android 应用 之路> 百度地图API使用(1)

    简介 详情请看百度地图官方网站 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction 使用方式 申请密钥,针对移动 ...

  4. Android应用中使用百度地图API并加入标注(一)

    网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包       要在Android应用中使用百度地图API,就须要 ...

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

    官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发人员们提供了例如以下类型的地图覆盖物: ...

  6. 我的Android开发之路——百度地图开源工具获取定位信息

    定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...

  7. Android应用中使用百度地图API之POI(三)

    先看执行后的图吧: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFqaWFuamll/font/5a6L5L2T/fontsize/400/fill/ ...

  8. Android端百度地图API使用详解

    百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...

  9. Android 百度地图API 定位 导航

    看看这个利用百度地图定位并实现目的地导航的Demo. 首先看实现效果:                          进 入后首先会得到当前位置,在地图上显示出来.在输入框中输入目的地后,就会在地 ...

随机推荐

  1. Intellij IDEA 封装Jar包(提示错误: 找不到或无法加载主类)

    封装的过程如下: 然后准备打包 选择Build或者ReBuild即可. 但这样就会引起开始第一个图的问题.提示无法加载主类,另外一个情况就是所有的外部第三方jar包都被封装到一个jar包里面了. 那么 ...

  2. AC自动机模板题

    AC自动机学习博客 AC自动机理解要点: 1)fail指针指向的是每个节点,在字典树上和这个节点后缀相同的最长单词,每次都这样匹配,必定不会漏过答案. 2)字典树建立后,会在bfs求fail阶段把字典 ...

  3. MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb,因生命期有各种变化,因此对此表的更新写操作非常多,老大给我看了一篇文章,才知道mongodb已经支持lsm存储方式了. 原文如连接:http ...

  4. linux 安装python

    wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz #下载安装包 tar zxvf Python-3.6.0.tgz #解压 . ...

  5. ACM java写法入门

    打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客, 记录java的大数运 ...

  6. 文件IO(存取.txt文件)

    //存文件方法 public void Save_File_Info(string Save_Path) { //根据路径,创建文件和数据流 FileStream FS = new FileStrea ...

  7. ubuntu系统复制到其他地方或克隆后,如何正确修改IP及MAC地址的解决方案(图文详解)

    修改ip地址 永久修改MAC地址 方法一: 1)编辑“/etc/init.d/rc.local”文件(sudo gedit /etc/init.d/rc.local) 2)在此配置文件的最后面加上如( ...

  8. 《Crafting Rails 4 Applications》的笔记-第28页

    进行邮件测试,你需要在dummy目录下的虚拟程序添加一个配置 In your config/enviroments/test.rb, by default you should have the li ...

  9. mvc框架的学习步骤

    1 搭建环境.有个感性认识 2 如何完成controller和viewer的映射 3 如何把值传给controller 4 controller如何把值传给view 5 异常处理 6 页面标签 7文件 ...

  10. C++的引用本质上等同于C的指针

    本文给出一个很小的例子,通过反汇编后观察认为,C++的引用本质上等同于C的指针. o foo1.cpp v.s. foo2.cpp o 对foo1.cpp 和foo2.cpp进行编译 $ g++ -g ...