当前位置:   article > 正文

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

百度地图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);
  • 1
  • 2
  • 3
  • 4

指南针

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

// 设置指南针是否显示
map.setCompassEnable(true);
Point point = map.getCompassPosition();
// map.setCompassPosition(new Point(100, 100));
// map.setCompassIcon(icon);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

比例尺

// 获取比例尺控件的宽度
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));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

缩放按钮

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

地图上控件边距

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

效果图

在这里插入图片描述

地图手势

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

地图手势默认开启,可以通过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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

地图双击事件监听接口

// 地图双击事件监听接口
public interface OnMapDoubleClickListener {
    /**
     * 地图双击事件监听回调函数
     * @param point 双击的地理坐标
     */
    void onMapDoubleClick(LatLng point);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

地图长按事件监听接口

// 地图长按事件监听接口
public interface OnMapLongClickListener {
    /**
     * 地图长按事件监听回调函数
     * @param point 长按的地理坐标
     */
    void onMapLongClick(LatLng point);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

地图手势事件回调接口

// 地图手势事件回调接口
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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

用户触摸地图时回调接口

// 用户触摸地图时回调接口
public interface OnMapTouchListener {
    /**
     * 当用户触摸地图时回调函数
     * @param motionEvent 触摸事件
     */
    void onTouch(MotionEvent motionEvent);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

地图状态

地图状态类

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

地图渲染完成回调接口

//  地图渲染完成回调接口
public interface OnMapRenderCallback {
    /**
     * 地图渲染完成回调函数
     */
    void onMapRenderFinished();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/1003255
推荐阅读
相关标签
  

闽ICP备14008679号