首页 > 其他分享 >百度地图SDK Android版开发 5 地图交互操作

百度地图SDK Android版开发 5 地图交互操作

时间:2024-08-15 19:52:40浏览次数:8  
标签:控件 缩放 地图 接口 设置 Android 手势 SDK

百度地图SDK Android版开发 5 地图交互操作

前言

前文介绍了三个主题:创建显示地图;切换地图类型;显示定位。本文重点介绍地图交互操作及相关的类和接口。

  • 百度地图支持多种地图交互操作,用户可以通过手势或控件进行地图操作,以实现更好的地图浏览体验。另一方面开发者通过代码实现特定业务场景的地图交互。

  • 百度地图通过设定不同的地图状态,来改变地图视野。

  • 最后是不属于地图操作的地图事件,但是也很重要。

    • 比如地图加载完成事件,一些特定接口需要在地图加载完成后才能调用(在显示定位本文均有提及)。

控件

控件介绍

百度地图提供一些基础的地图控件,包括LOGO、指南针、比例尺和缩放按钮。

控件功能默认显示默认位置
LOGO可设置显示相对位置
(左下,中下,右下,左上,中上,右上)
显示左下角
指南针设置是否显示,设置中心点绝对位置不显示左上角
比例尺设置是否显示,设置左上角显示绝对位置显示左下角
缩放按钮设置是否显示,设置左上角绝对位置显示右下角

注意:地图Logo不允许遮挡,可通过设置地图上控件边距来避免遮挡。

注意:根据百度地图API使用条款您的应用不得删除或覆盖百度地图logo或版权声明。地图内边距允许您在必要时重新定位这些元素,若您需要在地图布局顶底部显示自定义UI,请设置内边距以保证百度地图logo和版权声明始终可见。

接口

MapView

MapView类中Logo、比例尺、缩放按钮的接口:

类型方法说明
final voidsetLogoPosition(LogoPosition position)设置Logo位置
final LogoPositiongetLogoPosition()获取Logo位置
intgetScaleControlViewHeight()获取比例尺控件的高度
intgetScaleControlViewWidth()获取比例尺控件的宽度
booleanisShowScaleControl()获取比例尺控件是否显示
voidshowScaleControl(boolean show)设置是否显示比例尺控件
PointgetScaleControlPosition()获取比例尺控件对应的屏幕位置
voidsetScaleControlPosition(Point p)设置比例尺控件的位置,在onMapLoaded后生效
voidshowZoomControls(boolean show)设置是否显示缩放控件
PointgetZoomControlsPosition()获取缩放控件的屏幕位置
voidsetZoomControlsPosition(Point p)设置缩放控件的位置,在 onMapLoaded 后生效

BaiduMap

BaiduMap类中指南针,地图上控件边距、地图UI控制器的接口:

类型方法说明
voidsetCompassEnable(boolean enable)设置指南针是否显示
voidsetCompassIcon(Bitmap icon)设置指南针自定义图标
PointgetCompassPosition()获取屏幕坐标系下指南针位置
voidsetCompassPosition(Point p)设置指南针的位置
final voidsetViewPadding(int left, int top, int right, int bottom)设置地图上控件与地图边界的距离,包含比例尺、缩放控件、logo、指南针的位置。
只有在 OnMapLoadedCallback.onMapLoaded() 之后设置才生效。
参数依次为左边距、上边距、右边距、下边距(单位为pixel)
UiSettingsgetUiSettings()获取地图UI控制器

UiSettings

UiSettings类中指南针的接口:

类型方法说明
booleanisCompassEnabled()获取是否允许指南针
voidsetCompassEnabled(boolean enabled)设置是否允许指南针

LogoPosition

Logo位置枚举,左下开始顺时针的6个位置:

位置说明
logoPostionleftBottom屏幕左下位置
logoPostionleftTop屏幕左上位置
logoPostionCenterTop屏幕中上位置
logoPostionRightTop屏幕右上位置
logoPostionRightBottom屏幕右下位置
logoPostionCenterBottom屏幕中下位置

示例代码

Logo

// 获取Logo位置
LogoPosition position = mapView.getLogoPosition();
// 设置Logo位置
mapView.setLogoPosition(LogoPosition.logoPostionRightBottom);

指南针

// 获取是否允许指南针
boolean enabled = uiSettings.isCompassEnabled();
// 设置是否允许指南针
uiSettings.setCompassEnabled(true);

// 设置指南针是否显示
map.setCompassEnable(true);
Point point = map.getCompassPosition();
// map.setCompassPosition(new Point(100, 100));
// map.setCompassIcon(icon);

比例尺

// 获取比例尺控件的宽度
int width = mapView.getScaleControlViewWidth();
// 获取比例尺控件的高度
int height = mapView.getScaleControlViewHeight();

// 获取比例尺控件是否显示
boolean isShow = mapView.isShowScaleControl();
// 设置是否显示比例尺控件
mapView.showScaleControl(isShow);

// 获取比例尺控件对应的屏幕位置
Point point = mapView.getScaleControlPosition();
// 设置比例尺控件的位置,在 onMapLoadFinish 后生效
// mapView.setScaleControlPosition(new Point(20, 20));

缩放按钮

mapView.showZoomControls(true);
Point point = mapView.getZoomControlsPosition();
// mapView.setZoomControlsPosition(new Point(0, 0));

地图上控件边距

// 设置地图上控件与地图边界的距离,包含比例尺、缩放控件、logo、指南针的位置。
// 只有在 OnMapLoadedCallback.onMapLoaded()之后设置才生效。
// 参数依次为左边距、上边距、右边距、下边距(单位为 pixel)
int left = 20;
int top = 0;
int right = 20;
int bottom = 0;
map.setViewPadding(left, top, right, bottom);

效果图

在这里插入图片描述

地图手势

提供了多种手势供 户与地图之间进行交互,如平移、缩放、旋转、滑动、倾斜。

地图手势默认开启,可以通过UiSetting类提供的接口来控制手势的开关。

地图手势方法说明

手势说明状态开关默认
地图平移如果启用,则用户可以平移地图。控制是否启用或禁用平移的功能开启
地图缩放如果启用,用户可以双指点击或缩放地图视图。控制是否启用或禁用缩放手势开启
地图俯视(3D)如果启用,则用户可使用双指 向下或向上滑动到俯视图。控制是否启用或禁用俯视(3D)功能开启
地图旋转如果启用,则用户可使用双指 旋转来旋转地图。控制是否启用或禁用地图旋转功能开启
地图双击放大如果启用,则用户可双击放大当前地图中心点。控制是否设置双击地图按照当前地图中心点放大。开启
禁止所有手势如果启用,所有手势都将被禁用。控制是否一并禁止所有手势关闭

地图手势开关接口

UiSetting手势开关1

类型方法说明
voidsetScrollGesturesEnabled(enable)控制是否启用或禁用平移的功能
voidsetZoomGesturesEnabled(enable)控制是否启用或禁用缩放手势
voidsetOverlookingGesturesEnabled(enable)控制是否启用或禁用俯视(3D)功能
voidsetRotateGesturesEnabled(enable)控制是否启用或禁用地图旋转功能
voidsetEnlargeCenterWithDoubleClickEnable(enable)控制是否设置双击地图按照当前地图中心点放大。
voidsetAllGesturesEnabled(enable)控制是否一并禁止所有手势

UiSetting手势开关2

类型方法说明
voidsetDoubleClickZoomEnabled(boolean enabled)设置是否允许双击放大地图手势
voidsetDoubleClickMoveZoomEnable(boolean enabled)设置是否允许双击拖动缩放地图
voidsetFlingEnable(boolean enabled)设置是否允许抛出手势
voidsetInertialAnimation(boolean enabled)缩放动画惯性开关
voidsetTwoTouchClickZoomEnabled(boolean enabled)设置是否允许双指同时点击缩小地图手势
voidsetLatLngGesturesCenter(LatLng latLng)设置地理坐标为手势中心点
voidsetPointGesturesCenter(Point point)设置屏幕坐标为手势中心点

地图手势事件

BaiduMap类地图手势事件监听接口:

类型方法说明
voidsetOnMapClickListener(BaiduMap.OnMapClickListener listener)设置地图单击事件监听者
voidsetOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)设置地图双击事件监听者
voidsetOnMapLongClickListener(BaiduMap.OnMapLongClickListener listener)设置地图长按事件监听者
voidsetOnMapGestureListener(BaiduMap.onMapGestureListener listener) Android地图SDK自7.5.2起支持手势事件回调,开发者可以根据回调信息判断当前手势事件与地图状态变化的关系,还可以决定手势事件消费时机。
voidsetOnMapTouchListener(BaiduMap.OnMapTouchListener listener)设置触摸地图事件监听者

地图单击事件监听接口

// 地图单击事件监听接口
public interface OnMapClickListener {
    /**
     * 地图单击事件回调函数
     * @param point 点击的地理坐标
     */
    void onMapClick(LatLng point);

    /**
     * 地图内 Poi 单击事件回调函数
     * @param mapPoi 点击的 poi 信息
     */
    void onMapPoiClick(MapPoi mapPoi);
}

地图双击事件监听接口

// 地图双击事件监听接口
public interface OnMapDoubleClickListener {
    /**
     * 地图双击事件监听回调函数
     * @param point 双击的地理坐标
     */
    void onMapDoubleClick(LatLng point);
}

地图长按事件监听接口

// 地图长按事件监听接口
public interface OnMapLongClickListener {
    /**
     * 地图长按事件监听回调函数
     * @param point 长按的地理坐标
     */
    void onMapLongClick(LatLng point);
}

地图手势事件回调接口

// 地图手势事件回调接口
public interface onMapGestureListener {
    /**
     * 平移
     * @param start 平移手势开始屏幕坐标点
     * @param end   平移手势结束屏幕坐标点
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapScroll(Point start, Point end, MapStatus curStatus);

    /**
     * 双击放大
     * @param point 屏幕坐标点
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapDoubleTouch(Point point, MapStatus curStatus);

    /**
     * 双指点击缩小
     * @param p1 第一个屏幕坐标点
     * @param p2 第二个屏幕坐标点
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapTwoClick(Point p1, Point p2, MapStatus curStatus);

    /**
     * 捏合
     * @param p1 第一个屏幕坐标点
     * @param p2 第二个屏幕坐标点
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapKneading(Point p1, Point p2, MapStatus curStatus);

    /**
     * 俯视
     * @param p1 第一个屏幕坐标点
     * @param p2 第二个屏幕坐标点
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapOverLooking(Point p1, Point p2, MapStatus curStatus);

    /**
     * 惯性抛出手势
     * @param event 触摸事件
     * @param velocityX X轴上的移动速度,像素/秒
     * @param velocityY Y轴上的移动速度,像素/秒
     * @param curStatus 当前地图状态
     * @return 该手势事件是否由SDK消费
     */
    boolean onMapFling(MotionEvent event, float velocityX, float velocityY,
                       MapStatus curStatus);

    /**
     * 手势事件结束后地图状态
     * @param status 当前地图状态
     */
    void onMapStatusChangeFinish(MapStatus status);
}

用户触摸地图时回调接口

// 用户触摸地图时回调接口
public interface OnMapTouchListener {
    /**
     * 当用户触摸地图时回调函数
     * @param motionEvent 触摸事件
     */
    void onTouch(MotionEvent motionEvent);
}

地图状态

地图状态类

MapStatus类定义了地图的状态,如中心点经纬度,旋转角度,俯视角度,缩放级别等。

类型方法说明
LatLngtarget地图操作的中心点。
LatLngBoundsbound当前屏幕显示范围内的地理范围,当旋转或俯视时,是当前屏幕可见显示范围的最大外接矩形。
PointtargetScreen地图操作中心点在屏幕中的坐标
WinRoundwinRound屏幕范围
floatzoom地图缩放级别 4~21,室内图支持到22
floatoverlook地图俯仰角度。
floatrotate地图旋转角度。

地图状态更新类

MapStatusUpdate类描述地图状态将要发生的变化。

通过MapStatusUpdateFactory类构建地图缩放等级、地图显示范围,改变地图中心点等地图更新实例。

类型方法说明
static MapStatusUpdatenewLatLng(LatLng latLng)设置地图新中心点
static MapStatusUpdatenewLatLngBounds(LatLngBounds bounds)设置显示在屏幕中的地图地理范围
static MapStatusUpdatenewLatLngBounds(LatLngBounds bounds, int width, int height)设置显示在规定宽高中的地图地理范围
static MapStatusUpdatenewLatLngBounds(LatLngBounds bounds, int paddingLeft, int paddingTop, int paddingRight, int paddingBottom)设置显示在指定相对于MapView的padding中的地图地理范围
static MapStatusUpdatenewLatLngZoom(LatLngBounds bounds, int paddingLeft, int paddingTop, int paddingRight, int paddingBottom)根据Padding设置地理范围的合适缩放级别
static MapStatusUpdatenewLatLngZoom(LatLng latLng, float zoom)设置地图中心点以及缩放级别
static MapStatusUpdatenewMapStatus(MapStatus mapStatus)设置地图新状态
static MapStatusUpdatescrollBy(int xPixel, int yPixel)按像素移动地图中心点
static MapStatusUpdatezoomBy(float amount)根据给定增量缩放地图级别
static MapStatusUpdatezoomBy(float amount, Point focus)根据给定增量以及给定的屏幕坐标缩放地图级别
static MapStatusUpdatezoomIn()放大地图缩放级别
static MapStatusUpdatezoomOut()缩小地图缩放级别
static MapStatusUpdatezoomTo(float zoom)设置地图缩放级别

改变地图状态接口

BaiduMap类中改变地图状态和设置地图状态监听的接口:

类型方法说明
MapStatusgetMapStatus()获取地图的当前状态
voidsetMapStatus(MapStatusUpdate update)改变地图状态
voidanimateMapStatus(MapStatusUpdate update)以动画方式更新地图状态,默认动画耗时 300 ms
voidanimateMapStatus(MapStatusUpdate update, int durationMs)以动画方式更新地图状态
voidsetOnMapStatusChangeListener(BaiduMap.OnMapStatusChangeListener listener)设置地图状态监听者

地图状态改变接口

// 地图状态改变接口
public interface OnMapStatusChangeListener {
    int REASON_GESTURE = 1; // 用户手势触发导致的地图状态改变, 比如双击、拖拽、滑动底图
    int REASON_API_ANIMATION = 2; // SDK导致的地图状态改变, 比如点击缩放控件、指南针图标
    int REASON_DEVELOPER_ANIMATION = 3; // 开发者调用,导致的地图状态改变

    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     */
    void onMapStatusChangeStart(MapStatus status);

    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     * @param reason 地图状态改变的原因
     */
    void onMapStatusChangeStart(MapStatus status, int reason);

    /**
     * 地图状态变化中
     * @param status 当前地图状态
     */
    void onMapStatusChange(MapStatus status);

    /**
     * 地图状态改变结束
     * @param status 地图状态改变结束后的地图状态
     */
    void onMapStatusChangeFinish(MapStatus status);
}

限制地图显示范围和缩放级别

BaiduMap类中限制地图显示范围和缩放级别的接口:

类型方法说明
LatLngBoundsgetMapStatusLimit()获取当前地图可移动的实际地理范围
voidsetMapStatusLimits(LatLngBounds bounds)设置地图的可移动区域 V4.5.0版本起,该方法不与BaiduMap.OnMapLoadedCallback.onMapLoaded()关联,实际上该方法与 setMapStatus(MapStatusUpdate)并列同级 该方法执行完成之后,不可再调用setMapStatus(MapStatusUpdate),否则可能会更改 MapStatus,造成可移动区域设置不生效,setMapStatus(MapStatusUpdate) 方法可以放在该方法之前执行。
floatgetMaxZoomLevel()获取地图最大缩放级别
floatgetMinZoomLevel()获取地图最小缩放级别
voidsetMaxAndMinZoomLevel(float max, float min)设置地图最大以及最小缩放级别,地图支持的最大最小级别分别为[4-21] V5.0.0版本起,为了优化显示效果,地图支持最小缩放级别为4,即1000公里 该方法如果不是在初始化方法(如onCreate方法)中使用,则需要在该方法执行完成后,调用 setMapStatus(MapStatusUpdate)或者animateMapStatus(MapStatusUpdate)方法 否则出现不生效的情况。

其它地图事件

BaiduMap类中加载完成和渲染完成的接口:

类型方法说明
voidsetOnMapLoadedCallback(BaiduMap.OnMapLoadedCallback callback)设置地图加载完成回调,该接口需要在地图加载到页面之前调用,否则不会触发回调。
voidsetOnMapRenderCallbadk(BaiduMap.OnMapRenderCallback callback)设置地图渲染完成回调
voidsetOnMapRenderValidDataListener(BaiduMap.OnMapRenderValidDataListener listener)设置地图数据渲染是否有效监听者 V5.4.2新增接口

地图加载完成回调接口

// 地图加载完成回调接口
public interface OnMapLoadedCallback {
    /**
     * 地图加载完成回调函数
     */
    void onMapLoaded();
}

地图渲染完成回调接口

//  地图渲染完成回调接口
public interface OnMapRenderCallback {
    /**
     * 地图渲染完成回调函数
     */
    void onMapRenderFinished();
}

标签:控件,缩放,地图,接口,设置,Android,手势,SDK
From: https://blog.csdn.net/kikikiki001/article/details/141201111

相关文章

  • Android面试中Service夺命六小问
    1、请解释一下Android中的Service以及它的用途。Service是Android中的四大组件之一,它可以在后台执行长时间运行的操作,而不需要与用户进行交互。它主要用于执行一些不需要用户界面的任务,例如播放音乐、下载文件、同步数据等。Service有以下几个特点:后台运行:Service......
  • 微信小程序开发中的SDK集成与第三方推送
    微信小程序开发中,集成第三方推送内容可以通过使用第三方推送服务的SDK来实现。以下是一个示例代码案例,详细介绍了如何使用SDK集成第三方推送内容。一、SDK集成准备工作选择第三方推送服务提供商:根据需求和预算选择合适的第三方推送服务提供商,例如极光推送、个推、小米推送等......
  • 如何为微信小程序添加地图和位置服务
    为微信小程序添加地图和位置服务可以通过使用微信提供的地图组件和位置API实现。以下是详细步骤和示例代码:创建一个新的微信小程序项目:使用微信开发者工具创建一个新的微信小程序项目。在创建项目时,可以选择"位置"和"地图"权限,以便后续使用位置和地图服务。在小程序......
  • CDH 集群 使用 JindoFS SDK 访问 OSS
    CDH集群使用JindoFSSDK访问OSSCDH(Cloudera'sDistribution,includingApacheHadoop)是众多Hadoop发行版本中的一种,本文以CDH5.16.2为例介绍如何配置CDH支持使用JindoFSSDK访问OSS。步骤1.安装jar包下载最新的jar包jindofs-sdk-x.x.x.jar(​​下载页面​​),将......
  • uni-app使用天地图
    原因:由于主流地图(百度,高德,腾讯)商用收费属实昂贵,不得已很多人开始转战天地图。  方案:天地图想要在uniapp项目中正常使用目前的方案有两种1.通过web-view将html天地图嵌入项目中  优点:可以同时兼容微信小程序和APP缺点:地图嵌入后数据交互繁琐,小程序兼容了,但是兼的不是很......
  • React 高德地图 进京证 路线规划 问题小记
    一、加载问题用高德地图做了个进京证路线规划的功能,官网也是有React代码示例。但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用map这个变量肯定不行,果不其然是null,处理也简单,把公共变量都管理起来就行了。const[map,setMap]=useState(null);const[AMap,setAMa......
  • 23年9月最新微信小程序 手机号授权 (uniapp+盛派SDK) 帮你踩坑
    一、背景微信小程序手机号授权接口,从23年8月开始实行付费验证。文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getRealtimePhoneNumber.html 新版手机号授权说明如下:自2023年8月28日起【手机号实时验证组件】将需要付费使用。标准单价......
  • Android笔试面试题AI答之Kotlin(6)
    文章目录24.以下代码执行的结果是什么?25.解释一下下述Kotlin代码有什么问题?26.如何在Kotlin中创建常量?示例注意事项总结27.Koltin可以互换使用IntArray和Kotlin中的Array吗?IntArrayArray<Int>互换使用从IntArray到Array<Int>从Array<Int>到IntArra......
  • 金蝶云星空授权及使用SDK
    网址相关1.开放平台地址:https://openapi.open.kingdee.com/ApiDoc2.第三方授权地址:https://open.kingdee.com一、金蝶云星空授权第三方1.登录金蝶云星空后台,找到第三方授权设置2.点击新增按钮,进入新增第三方系统登录授权功能页面。3.点击”获取应用ID”按钮,根据提示......
  • Android SDK 遇到的坑之讯飞语音合成
    目录一、讯飞在线语音合成二、组件未安装.(错误码:21002)2.1Android10错误信息2.2Android13错误信息三、错误分析    3.1没有使用SpeechUtility.createUtility()设置appid  3.2 没有将libmsc.so放到工程中往期推荐一、讯飞在线语音合成   ......