百度地图创建InfoWindow自定义View显示

实现地图上显示多mark点,自定义infoWindow,跳转高德地图和百度地图 实现功能如上图所示 1.需要绘制多个mark点, 2.可以点击生成一个自定义的infowindow 3.点击可以根据本机状况跳转高德地图或者百度地图实现功能 一,绘制多个mark点 前提条件,我们继承好了高德地图和实现了地图绘制,实现了地图蓝点绘制我们根据接口得到了网点的json数据 数据结构是这样的 于是我们解析下数据,if(netWorkEntity.code.equals(" 阅读详情
最近学习使用百度地图,自己做了个可以简单搜索兴趣点,设置搜索范围,搜索关键字,定位功能的应用。在使用百度地图API时发现了问题。
我想要完成的需求是:
    在地图上长按然后弹出自定义的View,并且能与用户进行交互操作。

但在百度地图开发指南中关于弹出覆盖物就简单的一段实例,如下: 查看连接
  1. 弹出窗覆盖物  
  2.   
  3. 弹出窗覆盖物的实现方式如下,开发者可利用此接口,构建具有更强交互性的地图页面。  
  4. //创建InfoWindow展示的view    
  5. Button button = new Button(getApplicationContext());    
  6. button.setBackgroundResource(R.drawable.popup);    
  7. //定义用于显示该InfoWindow的坐标点    
  8. LatLng pt = new LatLng(39.86923, 116.397428);    
  9. //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量   
  10. InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);    
  11. //显示InfoWindow    
  12. mBaiduMap.showInfoWindow(mInfoWindow);  
  13. 下图为点击Marker弹出InfoWindow的示例图,开发者只需将InfoWindow的显示方法写在Maker的点击事件处理中即可实现该效果。  
  14. 运行结果如下:  



从上面简单的代码看出, InfoWindow可以显示View,但上面的实例仅仅是使用代码动态的创建了一个简单的View,但能不能从xml初始化一个自定义复杂的View呢?

在网上查阅资料发现各种答案,可能是度娘的原因,反正是没有找到有效的方法。有的解决了,但方法超复杂,不忍直视了。

自己就去查阅百度API,在InfoWindow的构造方法:

  1. InfoWindow  
  2.   
  3. public InfoWindow(View view,  
  4.           LatLng position,  
  5.           int yOffset)  
  6.   
  7. 通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中。  
  8.   
  9. 参数:  
  10.     view - InfoWindow 展示的 view  
  11.     position - InfoWindow 显示的地理位置  
  12.     yOffset - InfoWindow Y 轴偏移量  
  13.     listener - InfoWindow 点击监听者  
  14. 抛出:  
  15.     java.lang.IllegalArgumentException - view 和 position 不能为 null  

发现了InfoWindow的构造方法中,第一参数要求的是View,那能不能传入一个自定义的View呢,说干就干,就自己创建一个View,并将其传入InfoWindow,核心代码如下:

  1. //====================地图长按监听=============================  
  2.   
  3.     @Override  
  4.   
  5.     public void onMapLongClick(final LatLng latLng) {  
  6.   
  7.         //将长按点设置为地图显示中心  
  8.   
  9.         MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);  
  10.   
  11.         map.animateMapStatus(mapStatusUpdate);  
  12.   
  13.         map.clear();//清空地图上的标记  
  14.   
  15.         //长按点位置显示标记  
  16.   
  17.         markerOptions = new MarkerOptions();  
  18.   
  19.         markerOptions.position(latLng);  
  20.   
  21.         BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.location1);  
  22.   
  23.         markerOptions.icon(bitmapDescriptor);  
  24.   
  25.         markerOptions.zIndex(9);  
  26.   
  27.         Marker marker = (Marker) map.addOverlay(markerOptions);  
  28.   
  29.         //从xml创建要显示的View,并设置相应的值  
  30.   
  31.         LayoutInflater inflater = LayoutInflater.from(getApplicationContext());  
  32.   
  33.         View view = inflater.inflate(R.layout.layout_map_item, null);  
  34.   
  35.         TextView txtLatLng = (TextView)view.findViewById(R.id.text_item_latlng);  
  36.   
  37.         final EditText background = (EditText) view.findViewById(R.id.ed_item_background);  
  38.   
  39.         final EditText keyWord = (EditText) view.findViewById(R.id.ed_item_keyword);  
  40.   
  41.         Button btnSearch = (Button) view.findViewById(R.id.btn_search);  
  42.   
  43.         Button btnCancel = (Button) view.findViewById(R.id.btn_cancel);  
  44.   
  45.         txtLatLng.setText("纬度:"+latLng.latitude+",经度:"+latLng.longitude);  
  46.   
  47.         final LatLng lngFinal = latLng;  
  48.   
  49.         //点击view上面的检索按钮调用方法  
  50.   
  51.         btnSearch.setOnClickListener(new View.OnClickListener() {  
  52.   
  53.             @Override  
  54.   
  55.             public void onClick(View v) {  
  56.   
  57.                 //Log.d("WorkMainActivity","搜索附近500米");  
  58.   
  59.                 map.clear();//清空地图上的标记  
  60.   
  61.                 String circumBackground = background.getText().toString();  
  62.   
  63.                 if(null==circumBackground||"".equals(circumBackground)){  
  64.   
  65.                     return;  
  66.   
  67.                 }else {  
  68.   
  69.                     String keyWordString = keyWord.getText().toString();  
  70.   
  71.                     if(null==keyWordString||"".equals(keyWordString)){  
  72.   
  73.                         return;  
  74.   
  75.                     }else {  
  76.   
  77.                         int circum = Integer.parseInt(circumBackground);  
  78.   
  79.                         PoiNearbySearchOption poiNearbySearchOption = new PoiNearbySearchOption();  
  80.   
  81.                         poiNearbySearchOption.location(lngFinal);  
  82.   
  83.                         //以长按坐标点为中心,画指定半径的圆,并制定透明度为100,作为搜索范围  
  84.   
  85.                         CircleOptions circleOptions = new CircleOptions();  
  86.   
  87.                         circleOptions.center(lngFinal);  
  88.   
  89.                         circleOptions.radius(circum);  
  90.   
  91.                         circleOptions.fillColor(Color.argb(100,28,95,167));  
  92.   
  93.                         map.addOverlay(circleOptions);  
  94.   
  95.                         poiNearbySearchOption.keyword(keyWordString);  
  96.   
  97.                         poiNearbySearchOption.radius(circum);  
  98.   
  99.                         poiSearch.searchNearby(poiNearbySearchOption);  
  100.   
  101.                         poiSearch.setOnGetPoiSearchResultListener(WorkMainActivity.this);  
  102.   
  103.                     }  
  104.   
  105.                 }  
  106.   
  107.             }  
  108.   
  109.         });  
  110.   
  111.         //点击取消按钮  
  112.   
  113.         btnCancel.setOnClickListener(new View.OnClickListener() {  
  114.   
  115.             @Override  
  116.   
  117.             public void onClick(View v) {  
  118.   
  119.                 //Log.d("WorkMainActivity","取消搜索");  
  120.   
  121.                 map.hideInfoWindow();  
  122.   
  123.             }  
  124.   
  125.         });  
  126.   
  127.         InfoWindow infoWindow = new InfoWindow(view, latLng, -47);  
  128.   
  129.         map.showInfoWindow(infoWindow);  
  130.   
  131.     }  

至于View的定义文件,即layout_map_item文件代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               android:orientation="vertical"  
  4.               android:layout_width="wrap_content"  
  5.               android:background="#2B9685"  
  6.               android:layout_height="wrap_content">  
  7.     <TextView  
  8.             android:layout_width="100dp"  
  9.             android:layout_height="wrap_content"  
  10.             android:text="搜索附近"  
  11.             android:textSize="20sp"  
  12.             android:layout_gravity="center_horizontal"  
  13.             android:gravity="center_horizontal"  
  14.             />  
  15.     <TextView  
  16.             android:id="@+id/text_item_latlng"  
  17.             android:layout_width="wrap_content"  
  18.             android:layout_height="wrap_content"  
  19.             android:layout_gravity="center_horizontal"  
  20.             android:background="#37B158"  
  21.             />  
  22.     <LinearLayout  
  23.             android:orientation="horizontal"  
  24.             android:layout_width="match_parent"  
  25.             android:layout_height="wrap_content">  
  26.         <EditText  
  27.                 android:id="@+id/ed_item_background"  
  28.                 android:layout_width="0dp"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:layout_weight="1"  
  31.                 android:background="#58C7F9"  
  32.                 android:hint="范围(m)"  
  33.                 />  
  34.         <EditText  
  35.                 android:id="@+id/ed_item_keyword"  
  36.                 android:layout_width="0dp"  
  37.                 android:layout_height="wrap_content"  
  38.                 android:layout_weight="1"  
  39.                 android:background="#BCEAA7"  
  40.                 android:hint="关键字"  
  41.   
  42.                 />  
  43.     </LinearLayout>  
  44.     <LinearLayout  
  45.             android:orientation="horizontal"  
  46.             android:layout_width="match_parent"  
  47.             android:layout_height="wrap_content">  
  48.         <Button  
  49.                 android:id="@+id/btn_search"  
  50.                 android:layout_width="0dp"  
  51.                 android:layout_height="wrap_content"  
  52.                 android:background="#BABA66"  
  53.                 android:textSize="20sp"  
  54.                 android:text="检索"  
  55.                 android:layout_weight="1"  
  56.                 />  
  57.         <Button  
  58.                 android:id="@+id/btn_cancel"  
  59.                 android:layout_width="0dp"  
  60.                 android:layout_height="wrap_content"  
  61.                 android:background="#BABAFF"  
  62.                 android:textSize="20sp"  
  63.                 android:layout_weight="1"  
  64.                 android:text="取消"  
  65.                 />  
  66.     </LinearLayout>  
  67.   
  68.   
  69. </LinearLayout>  

结果发现,确实可行,运行效果如下:(注:该程序编译版本API 19,需要手机,模拟器4.4.2以上的版本才能正常运行,如果版本过低,可以更改 AndroidManifest.xml中的<uses-sdk android:minSdkVersion="19"/>标签,改成相应版本即可)




(下面附上程序全部代码)

下载源代码


// 截图,在SnapshotReadyCallback中保存图片到 sd 卡
                    mBaiduMap.snapshot(new SnapshotReadyCallback() {
                        public void onSnapshotReady(Bitmap snapshot) {
                            File file = new File("/mnt/sdcard/test.png");
                            FileOutputStream out;
                            try {
                                out = new FileOutputStream(file);
                                if (snapshot.compress(
                                        Bitmap.CompressFormat.PNG, 100, out)) {
                                    out.flush();
                                    out.close();
                                }
                                Toast.makeText(MapControlDemo.this,
                                        "屏幕截图成功,图片存在: " + file.toString(),
                                        Toast.LENGTH_SHORT).show();
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });


接入百度地图定位加Marker点击事件 *在开始之前需要百度地图的包,定位方面需要这两个包,自己下载以及解压之后整体将libs包方放入即可,不要忘记放进去之后clear才可以 哈,多的也不说了,网上很多,先来一个代码,这是xmlbujuwenjai LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_ 阅读详情

相关推荐

【深度剖析】三一重工的数字化转型(中篇)

三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。

领信卓越的博客 2306

百度地图API——修改infowindow样式

前言 最近又用到了百度地图api,之前用到的是百度地图js api的写法,需要一个个定义对象,添加事件或者监控,最后画到地图上,时不时还有渲染时序不对的情况,非常的不友好。所以这次用了vue Baidu Map,基于百度地图 JS API 开发的开源库的封装,减少了代码量,虽然文档部分封装和说明文档不是友好,但交互性相比之前的好多了。 用到了的覆盖物较多,信息窗体infowindow——直角边框加白底黑字,那么的 普通 ,肯定要修改一下,可是封装好的vue组件也不支持直接给style换底色和圆角,参阅其

wch0001的博客 1万+

2023年LitCTF web组wp

1、导弹迷踪2、1zjs3、php是世界上最好的语言!!4、Ping5、我Flag呢?7、作业管理系统8、Vim yyds10、这是什么?SQL!注一下!11、Flag点击就送!12、就当无事发生13、彩蛋。

m0_74160536的博客 1589

vue中使用百度地图自定义信息窗口

vue项目中通过百度地图API实现自定义信息窗口(通过infoBox实现自定义信息窗口)

qq_43651168的博客 4179

(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

Deepracer training 流程

Rainbow 4711

别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)

本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。

weixin_28730131的博客 504

自定义百度地图inforwindow弹出功能

自定义百度地图inforwindow弹出功能,并让其跟随点击点移动

weixin_42252416的博客 2226

【crawler笔记】R语言简单动态网页爬虫(rvest包)示例

1、爬虫目标 大家普遍认为Python的爬虫功能强大,但在解决动态加载或者登陆网站时,Python存在一定困难的,相对于一些普通爬虫,使用R语言会更方便。 以https://www.thepaper.cn/为例,爬取首页的新闻(标题、内容、时间),主要采用的是动态网页中常用的httr包。 初始学习时,参考了B站《20分钟入门基于R语言的网络爬虫_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili》的视频,但代码运行出现了报错,所以在原代码上做了修改。 2、代码分析及报错修改 library(rv

seeyouer1205的博客 3275

百度地图InfoWindow信息窗口的自定义和样式修改

最近捣腾百度地图,在做标志物点击事件显示信息窗口时,发现官方的信息窗口只给了固定的样式,且比较普通。那么该如何想修改成自己想要的样式? 1.在官方给出的原基础上进行修改 了解这种方法有助于你理解官方的信息窗口结构。这里我拿官方示例来进行举例:纯文字信息窗口 1.我们平时想要修改js生成的样式或者不是自己写的的样式时,需要找到其类名或者id名,然后在全局样式下进行修改。 2.所以我们直接打开控制台,解析结构,重点来了:发现官方的信息窗口内部是由9个div组成的,具体按照顺序分布情况是上面三个(左上、中间、右上

yokimiya 1万+

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2515

AI预测彩票,使用chatgpt和lstm神经网络(文末附源码)

AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋)

淘淘小窝 1万+

百度地图开发添加覆盖物的信息时出现的问题new infoWindow的时候

新的百度地图SDK的此构造方法为四个参数的解决方法 public InfoWindow(BitmapDescriptor bd,         LatLng position,     int yOffset,          InfoWindow.OnInfoWindowClickListener listener) 参数: bd - InfoWindow 展示的bitma

chenbengang的博客 2003

【教程4>第1章>第11节】使用MATLAB快速产生批量verilog语句加快FPGA开发

...........如果手动写,那么就非常麻烦,这个时候,我们借助matlab,则可以快速生成上述类型的verilog程序,我们编写如下的MATLAB语句。\n");\n");end。

FPGA/MATLAB学习教程/源码/项目合作开发 1239

百度地图SDK Android版开发 10 InfoWindow

前文介绍百度地图添加Marker的使用方法,Marker结合InfoWindow可用展示更详尽的信息。本文将介绍以下内容:构造InfoWindow对象的两种方式;地图类显示和隐藏InfoWindow的方法;自定义类,通过Marker显示InfoWindow。

程序喵D的博客 3118

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

关于百度地图InfoWindow响应自定义布局点击事件

关于百度地图InfoWindow响应自定义布局点击事件大概讲解:在百度地图上显示一个marker,当marker被点击后,会弹出一个自定义view,当时在公司做这个功能,被坑惨了,死活弹不出来,不响应.接下来看一下效果图,代码有详细注释,进去之后把百度申请的秘钥换成自己的.有一部分是检测网络代码.这个不用管.代码如下:public class MainActivity extends Activi...

爱无痕,累无边 2681

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 百度地图禁止双击事件,关于百度地图InfoWindow响应自定义布局点击事件

大概讲解:在百度地图上显示一个marker,当marker被点击后,显示自定义的View.当自定义的View被点击后,响应不同Button的点击事件。被百度这个infowindo里面的view坑惨了,一直以为不能点击呢??原来里面的view可以点击也可以被响应!!先看效果图:备注:点击详情(进入此任务详情、点击导航进入百度导航)代码如下:baiduMap.setOnMarkerClickListe...

weixin_42511396的博客 598

Android — 之百度地图定位+添加Mark+InfoWindow

前言:  新手上路,这几天在弄百度地图SDK的使用(吐槽 : 官网上的开发指南简直就是实力坑爹,可能是开发人员太忙,维护不及时吧),我对本次学习的要求也不高:能正常显示地图,能定位,能添加mark(覆盖物),点击mark时能提示当前位置信息就行,再深的东西,以后有时间再去研究吧,毕竟新手还是欠火候。

man_help的博客 1万+

Android——百度地图弹出详情窗口InfoWindow

百度地图点击标志点Marker,弹出详情窗InfoWindow

xinychan的博客 3187

使用百度地图BMap.InfoWindow,分别显示不同的信息窗口

    使用BMap.InfoWindow,在for循环展示信息的时候,总是显示最后一条信息的数据。 其实,可以讲BMap.InfoWindow的创建写在一个单独的function中。这样,每一个BMap.InfoWindow,就是显示的当条的信息。   [javascript] view plaincopyprint? function callback(xyR...

Rambo 1629

百度地图3.2.0InfoWindow使用总结

要显示一个自定义布局在百度地图上面: 方法一: 1.生成view mOverlayView = LayoutInflater.from(this).inflate(R.layout.overlay_map, null); 2,设置控件点击事件: MQuery mmq = new MQuery(mOverlayView); mmq.id(R.id.name).text(chooice

touch_ping的专栏 1446

百度地图 android 信息窗口,Android——百度地图弹出详情窗口InfoWindow

package com.example.mapdemo02;import java.util.ArrayList;import java.util.List;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClien...

weixin_30111715的博客 450

android百度地图InfoWindow重叠问题解决

用的最新的百度地图,在给marker添加view作为infowindow的时候出现了两个infowindow相互重叠 查看源码infowindow有两个构造方法,3 个参数和4个参数的三个参数的直接传的是View 将View通过BitmapDescriptorFactory.fromView(info)转换,改用4个参数的构造方法就未出现重叠 缺点:只能设置整个infowindow的点...

GuZhC的博客 2023

百度地图------百度infowindow重影问题记录我的

关于百度地图infowindow重影问题,可以参考

somethingstill的博客 2811

安卓百度地图给Marker点添加InfoWindow(弹窗)

首先,先看一下效果图吧。   Marker应该在添加的时候不是什么大问题,直接添加就可以。下面是添加Marker的代码。注意,我辨别Marker为了方便用的是title,大家可以用bundle来存储传值。 OverlayOptions option = new MarkerOptions() .position(lspoint) ...

Zhujiang 6197
上一篇: Android关联源码support-v4的问题解决
下一篇: android 常用方法集合
xiaoxiandroid
博客等级 码龄12年 12粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值