百度地图SDK Android版开发 10 InfoWindow

2024-09-05 13:36

本文主要是介绍百度地图SDK Android版开发 10 InfoWindow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

百度地图SDK Android版开发 10 InfoWindow

  • 前言
  • InfoWindow 相关类和接口
    • BaiduMap类
    • InfoWindow 类
      • 构造方法
      • getter
      • setter
      • OnInfoWindowClickListener 接口
  • InfoWindowAdapter 相关类和方法
    • BaiduMap类
    • InfoWindowAdapter 接口
    • Marker 类
  • 示例
    • 界面布局
    • MapInfoWindow类
      • 常量
      • 成员变量
      • 初始化
      • 创建与移除覆盖物
      • 显示与隐藏InfowWindow
      • 设置属性
      • 加载与移除地图
    • MapInfoWindowActivity 类
      • 控件响应事件
    • 运行效果图

前言

前文介绍百度地图添加Marker的使用方法,Marker结合InfoWindow可用展示更详尽的信息。本文将介绍以下内容:

  1. 构造InfoWindow对象的两种方式;
  2. 地图类显示和隐藏InfoWindow的方法;
  3. 自定义InfoWindowAdapter类,通过Marker显示InfoWindow

InfoWindow 相关类和接口

BaiduMap类

类型方法说明
List< InfoWindow >getAllInfoWindows()5.4.0版本新增接口 获取已添加的所有InfoWindow对象
voidshowInfoWindow(InfoWindow infoWindow)显示 InfoWindow,。
该接口会先隐藏其他已添加的InfoWindow, 再添加新的InfoWindow
voidshowInfoWindow(InfoWindow infoWindow, boolean isHideOthers)5.4.0版本新增接口 显示 InfoWindow。
该接口可以设置是否在添加InfoWindow之前,先隐藏其他已经添加的InfoWindow.
voidshowInfoWindows(List< InfoWindow > infoWindowList)5.4.0版本新增接口 添加多个InfoWindow
voidhideInfoWindow()隐藏地图上的所有InfoWindow
voidhideInfoWindow(InfoWindow infoWindow)5.4.0版本新增接口 清除特定的InfoWindow
voidclear()清空地图所有的 Overlay 覆盖物以及 InfoWindow

InfoWindow 类

构造方法

在地图中显示一个信息窗口,可以设置一个View作为该窗口的内容,也可以设置一个 BitmapDescriptor 作为该窗口的内容。

方式一:通过添加View在地图上展示,交互操作通过View实现。

方式二:将View转化为Bitmap渲染在地图上,交互操作通过InfoWindow实现。这种方法性能比第一种方法要高。

方法说明
InfoWindow(BitmapDescriptor bd, LatLng position, int yOffset, InfoWindow.OnInfoWindowClickListener listener)通过传入的 BitmapDescriptor 构造一个 InfoWindow。
参数:
bd - **InfoWindow 展示的bitmap
**position - InfoWindow 显示的地理位置
yOffset - InfoWindow Y 轴偏移量
listener - InfoWindow 点击监听者
InfoWindow(View view, LatLng position, int yOffset)通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中,监听事件由开发者实现。
**参数:
**view - **InfoWindow 展示的 view
**position - InfoWindow 显示的地理位置
yOffset - InfoWindow Y 轴偏移量
InfoWindow(View view, LatLng position, int yOffset, boolean isFitDensityDpi, int targetDensityDpi)根据指定的像素密度对传入的view构造InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中,监听事件由开发者实现。
参数:
view - InfoWindow 展示的 view
position - InfoWindow 显示的地理位置
yOffset - InfoWindow Y 轴偏移量
isFitDensityDpi - 是否适配设备像素密度,默认不适配
targetDensityDpi - 目标像素密度, 建议传入设备默认像素密度值,否则可能会展示效果无法到达预期

getter

类型方法说明
BitmapDescriptorgetBitmapDescriptor()获取InfoWindow的BitmapDescriptor资源
LatLnggetPosition()获取位置数据
StringgetTag()获取InfoWindow的Tag
ViewgetView()获取InfoWindow的View
intgetYOffset()获取InfoWindow的YOffset偏移

setter

类型方法说明
voidsetBitmapDescriptor(BitmapDescriptor mBitmapDescriptor)更新InfoWindow的BitmapDescriptor属性。
voidsetPosition(LatLng mPosition)设置位置数据
voidsetTag(String tag)设置InfoWindow的Tag
voidsetView(View mView)更新InfoWindow的View属性 注: 仅支持通过InfoWindow(View, LatLng, int, boolean, int) or InfoWindow(View, LatLng, int)两种方式创建 InfoWindow的更新; 如果是使用了InfoWindow(BitmapDescriptor, LatLng, int, OnInfoWindowClickListener)方式创建的 InfoWindow,则不要使用该接口更新View属性,否则可能出现View与BitmapDescriptor层叠的现象。
voidsetYOffset(int mYOffset)设置InfoWindow的YOffset偏移

OnInfoWindowClickListener 接口

// 信息窗口点击事件监听接口
public interface OnInfoWindowClickListener {// 信息窗口点击事件处理函数void onInfoWindowClick();
}

InfoWindowAdapter 相关类和方法

自定义适配器InfoWindowAdapter并设置map.setInfoWindowAdapter(adapter),调用marker.showInfoWindow()即可实现显示InfoWindow

BaiduMap类

类型方法说明
voidsetInfoWindowAdapter(InfoWindowAdapter adapter)设置InfoWindowAdapter

InfoWindowAdapter 接口

public interface InfoWindowAdapter {View getInfoWindowView(Marker marker);int getInfoWindowViewYOffset();InfoWindow getInfoWindow(Marker marker);
}

Marker 类

Marker中的InfoWindow方法

类型方法说明
voidshowInfoWindow()添加 Marker 关联的InfoWindow,两者的更新是相互独立的。
类型方法说明
booleanisInfoWindowEnabled()判断是否显示InfoWindow
InfoWindowgetInfoWindow()获取 Marker 绑定的InfoWindow
voidsetPositionWithInfoWindow(LatLng position)设置 Marker 覆盖物的位置坐标,并同步更新与Marker关联的InfoWindow的位置坐标.
voidshowInfoWindow(InfoWindow mInfoWindow)添加 Marker 关联的InfoWindow,两者的更新是相互独立的。
voidshowSmoothMoveInfoWindow(InfoWindow mInfoWindow)该接口适用于小车平滑移动中,InfoWindow需要跟随 Marker 频繁动态更新View属性的场景。
voidhideInfoWindow()移除与 Marker 绑定的InfoWindow
voidupdateInfoWindowBitmapDescriptor(BitmapDescriptor bitmapDescriptor)更新与Marker绑定的InfoWindow对应的BitmapDescriptor,适用于以BitmapDescriptor方式创建InfoWindow 注: 仅支持通过InfoWindow.InfoWindow(BitmapDescriptor, LatLng, int, InfoWindow.OnInfoWindowClickListener) 方式创建的InfoWindow的更新;
voidupdateInfoWindowPosition(LatLng position)更新与Marker绑定的InfoWindow对应的位置
voidupdateInfoWindowView(View view)更新与Marker绑定的InfoWindow对应的View,适用于以View方式创建InfoWindow 注: 仅支持通过InfoWindow.InfoWindow(View, LatLng, int, boolean, int) or InfoWindow.InfoWindow(View, LatLng, int)两种方式创建的InfoWindow的更新;
voidupdateInfoWindowYOffset(int yOffset)更新与Marker绑定的InfoWindow对应的yOffset

示例

在地图上显示多个Marker覆盖物,点击Marker显示InfoWindow。其中InfoWindow显示的信息通过MarkerOptionsextraInfo传递。

界面布局

在这里插入图片描述

  • 布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.baidudemo.MapInfoWindowActivity"><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="0dp"android:clickable="true"app:layout_constraintBottom_toTopOf="@id/bottomView"app:layout_constraintTop_toTopOf="parent" /><androidx.appcompat.widget.LinearLayoutCompatandroid:id="@+id/bottomView"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toBottomOf="@id/bmapView"><RadioGroupandroid:id="@+id/RadioGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/background_dark"android:gravity="center_horizontal"android:orientation="horizontal"android:paddingHorizontal="10dp"><RadioButtonandroid:id="@+id/viewMode"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:checked="true"android:onClick="setMarkerFlag"android:text="View Mode"android:textColor="@color/white"android:textStyle="bold" /><RadioButtonandroid:id="@+id/bitmapMode"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="setMarkerFlag"android:text="Bitmap Mode"android:textColor="@color/white"android:textStyle="bold" /><RadioButtonandroid:id="@+id/adapter_mode"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="setMarkerFlag"android:text="Adapter Mode"android:textColor="@color/white"android:textStyle="bold" /></RadioGroup></androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapInfoWindow类

  • 以下是MapInfoWindow部分代码

常量

public static final String VIEW_MODE = "ViewMode";
public static final String BITMAP_MODE = "BitmapMode";
public static final String ADAPTER_MODE = "AdapterMode";

成员变量

// 覆盖物列表
List<Overlay> overlays = new ArrayList<>();
// 选中的状态
String selectedFlag = VIEW_MODE;
// 气泡图标
ArrayList<BitmapDescriptor> bitmaps = new ArrayList<>();
int yOffset = 0; // InfoWindow相对于point在y轴的偏移量

初始化

int[] drawableIds = BubbleIcons.Number;
for (int drawableId : drawableIds) {BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(drawableId);if (yOffset == 0)yOffset = -bitmap.getBitmap().getHeight();bitmaps.add(bitmap);
}
initEvent();
map.setInfoWindowAdapter(new MyInfoWindowAdapter());
  • 点击Marker显示InfoWindow
private void initEvent() {map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {switch (selectedFlag) {case VIEW_MODE:showViewMode(marker);break;case BITMAP_MODE:showBitmapMode(marker);break;case ADAPTER_MODE:showAdapterMode(marker);break;}return true;}});
}

创建与移除覆盖物

  • 批量添加覆盖物,通过MarkerOptionsextraInfo,向InfoWindow传递数据。
public void addMarkers() {// 构造大量坐标数据List<LatLng> points = new ArrayList<>();points.add(new LatLng(39.97923, 116.357428));points.add(new LatLng(39.94923, 116.397428));points.add(new LatLng(39.97923, 116.437428));points.add(new LatLng(39.92353, 116.490705));points.add(new LatLng(40.023537, 116.289429));points.add(new LatLng(40.022211, 116.406137));// 创建OverlayOptions的集合List<OverlayOptions> optionsList = new ArrayList<>();for (int i = 0; i < points.size(); ++i) {// 创建OverlayOptions属性MarkerOptions option = new MarkerOptions().position(points.get(i)).icon(bitmaps.get(i));Bundle bundle = new Bundle();bundle.putInt("id", i + 1);option.extraInfo(bundle);// 将OverlayOptions添加到listoptionsList.add(option);}// 在地图上批量添加List<Overlay> newOverlays = map.addOverlays(optionsList);overlays.addAll(newOverlays);
}
public void removeOverlay() {// 批量删除添加的多个 Overlay//map.removeOverLays(overlays);// 清空地图所有的 Overlay 覆盖物以及 InfoWindow// map.clear();// 删除覆盖物for (Overlay overlay : overlays) {overlay.remove();}overlays.clear();
}

显示与隐藏InfowWindow

  • 视图模式
// 使用View构造InfoWindow
private void showViewMode(Marker marker) {LatLng latLng = marker.getPosition();int id = marker.getExtraInfo().getInt("id");// 用来构造InfoWindow的ButtonButton button = new Button(context);button.setBackgroundResource(R.drawable.popup);button.setText("View示例-" + id);button.setTextColor(Color.BLACK);// 监听点击事件button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {map.hideInfoWindow();}});// 创建InfoWindowInfoWindow infoWindow = new InfoWindow(button, latLng, yOffset);// 显示InfoWindowmap.showInfoWindow(infoWindow);
}
  • 位图模式
private void showBitmapMode(Marker marker) {LatLng latLng = marker.getPosition();int id = marker.getExtraInfo().getInt("id");Button button = new Button(context);button.setBackgroundResource(R.drawable.popup);button.setText("Bitmap示例-" + id);button.setTextColor(Color.BLACK);button.setWidth(400);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(button);// InfoWindow点击事件监听接口InfoWindow.OnInfoWindowClickListener listener;// 监听点击事件listener = new InfoWindow.OnInfoWindowClickListener() {public void onInfoWindowClick() {// 隐藏地图上的所有InfoWindowmap.hideInfoWindow();}};// 创建InfoWindowInfoWindow infoWindow = new InfoWindow(bitmap, latLng, yOffset, listener);// 显示InfoWindowmap.showInfoWindow(infoWindow);
}
  • 适配器模式
private void showAdapterMode(Marker marker) {// 避免同时显示多个InfoWindowmap.hideInfoWindow();marker.showInfoWindow();
}
  • 自定义适配器
private class MyInfoWindowAdapter implements InfoWindowAdapter {@Overridepublic View getInfoWindowView(Marker marker) {return null;}@Overridepublic int getInfoWindowViewYOffset() {return yOffset;}@Overridepublic InfoWindow getInfoWindow(Marker marker) {LatLng latLng = marker.getPosition();int id = marker.getExtraInfo().getInt("id");Button button = new Button(context);button.setBackgroundResource(R.drawable.popup);button.setText("Adapter示例-" + id);button.setTextColor(Color.BLACK);button.setWidth(400);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(button);// InfoWindow点击事件监听接口InfoWindow.OnInfoWindowClickListener listener;listener = new InfoWindow.OnInfoWindowClickListener() {public void onInfoWindowClick() {map.hideInfoWindow();}};// 创建InfoWindowreturn new InfoWindow(bitmap, latLng, yOffset, listener);}
}

设置属性

public void setFlag(String flag) {selectedFlag = flag;// 隐藏地图上的所有InfoWindowmap.hideInfoWindow();
}

加载与移除地图

public void onMapLoaded() {addMarkers();setFlag(VIEW_MODE);
}public void onMapDestroy() {removeOverlay();for (BitmapDescriptor bitmap : bitmaps) {bitmap.recycle();}bitmaps = null;
}

MapInfoWindowActivity 类

  • 以下是MapInfoWindowActivity类部分代码

控件响应事件

public void setMarkerFlag(View view) {boolean checked = ((RadioButton) view).isChecked();if (!checked)return;int id = view.getId();String flag;if (id == R.id.viewMode)flag = MapInfoWindow.VIEW_MODE;else if (id == R.id.bitmapMode)flag = MapInfoWindow.BITMAP_MODE;else if (id == R.id.adapter_mode)flag = MapInfoWindow.ADAPTER_MODE;elsereturn;mapInfoWindow.setFlag(flag);
}

运行效果图

在这里插入图片描述

这篇关于百度地图SDK Android版开发 10 InfoWindow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139106

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta