腾讯地图SDK Android版开发 5 地图交互操作
前言
前文介绍了三个主题:创建显示地图;切换地图类型;显示定位。本文重点介绍地图交互操作及相关的类和接口。
-
腾讯地图支持多种地图交互操作,用户可以通过手势或控件进行地图操作,以实现更好的地图浏览体验。另一方面开发者通过代码实现特定业务场景的地图交互。
-
腾讯地图通过设定不同的地图状态,来改变地图视野。
-
最后是不属于地图操作的地图事件,但是也很重要。
- 比如地图加载完成事件 ,一些特定接口需要在地图加载完成后才能调用(在显示定位 和本文均有提及)。
控件介绍
控件介绍
腾讯地图提供一些基础的地图控件,包括LOGO、指南针、比例尺、定位按钮。
控件 | 功能 | 默认显示 | 默认位置 |
---|---|---|---|
LOGO | 可设置显示相对位置(左下,中下,右下,左上,中上,右上) 设置Logo的缩放比例 | 显示 | 右下角 |
指南针 | 设置是否显示,设置罗盘的填边 | 不显示 | 左上角 |
比例尺 | 设置是否显示,设置比例尺是否淡出,设置比例尺的显示相对位置位置 | 不显示 | 左下角 |
定位按钮 | 设置是否显示 | 不显示 | 右下角 |
接口
UiSettings
类用于操控地图控件,以定制自己想要的视图效果。UiSettings
类中地图控件的接口:
- LOGO
类型 | 方法 | 说明 |
---|---|---|
void | setLogoPosition (int logoAnchor) |
设置Logo的显示位置 |
void | setLogoPosition (int logoAnchor, int[] marginParams) |
根据地图四个Anchor 模式(左上、左下、右下、右上)以及相应的Margins来设置Logo位置 |
void | setLogoPositionWithMargin (int position, int top, int bottom, int left, int right) |
设置Logo的显示位置,带偏移量,单位像素 设置Logo的显示位置 |
void | setLogoScale (float logoScale) |
设置Logo的缩放比例,比例范围(0.7~1.3) |
void | setLogoSize (int logoSize) |
设置图标大小,暂时不生效 |
- 指南针
类型 | 方法 | 说明 |
---|---|---|
boolean | isCompassEnabled () |
获取当前是否开启罗盘控件 |
void | setCompassEnabled (boolean flag) |
设置是否显示指南针 |
void | setCompassExtraPadding (int xPadding, int yPadding) |
设置罗盘的填边 |
void | setCompassExtraPadding (int padding) |
设置罗盘的填边,只对Y轴生效 |
- 比例尺
类型 | 方法 | 说明 |
---|---|---|
boolean | isScaleViewEnabled () |
获取当前是否显示比例尺 |
void | setScaleViewEnabled (boolean show) |
设置当前是否显示比例尺 |
void | setScaleViewFadeEnable (boolean enable) |
设置比例尺是否淡出 |
void | setScaleViewPosition (int position) |
设置比例尺的显示位置 |
void | setScaleViewPositionWithMargin (int position, int top, int bottom, int left, int right) |
设置比例尺的显示位置,带偏移量,单位像素 |
- 定位按钮
类型 | 方法 | 说明 |
---|---|---|
boolean | isMyLocationButtonEnabled () |
获取当前是否显示定位控件 |
void | setMyLocationButtonEnabled (boolean flag) |
设置是否显示定位按钮 |
控件常量
TencentMapOptions
类中的控件常量:
- 定位
常量 | 说明 |
---|---|
LOGO_POSITION_BOTTOM_LEFT |
设置地图logo的显示位置:左下角 |
LOGO_POSITION_TOP_LEFT |
设置地图logo的显示位置:左上角 |
LOGO_POSITION_TOP_CENTER |
设置地图logo的显示位置:顶部居中 |
LOGO_POSITION_TOP_RIGHT |
设置地图logo的显示位置:右上角 |
LOGO_POSITION_BOTTOM_RIGHT |
设置地图logo的显示位置:右下角(默认) |
LOGO_POSITION_BOTTOM_CENTER |
设置地图logo的显示位置:底部居中 |
- 比例尺
常量 | 说明 |
---|---|
SCALEVIEW_POSITION_BOTTOM_LEFT |
设置地图比例尺的显示位置:左下角,默认 |
SCALEVIEW_POSITION_TOP_LEFT |
设置地图比例尺的显示位置:左上角 |
SCALEVIEW_POSITION_TOP_CENTER |
设置地图比例尺的显示位置:顶部居中 |
SCALEVIEW_POSITION_TOP_RIGHT |
设置地图比例尺的显示位置:右上角 |
SCALEVIEW_POSITION_BOTTOM_RIGHT |
设置地图比例尺的显示位置:右下角 |
SCALEVIEW_POSITION_BOTTOM_CENTER |
设置地图比例尺的显示位置:底部居中 |
地图控件点击事件
类型 | 接口 | 说明 |
---|---|---|
static interface | TencentMap.OnCompassClickedListener |
当地图的罗盘被点击时的回调接口 |
static interface | TencentMap.OnMyLocationClickListener |
点击我的位置时的回调接口 |
类型 | 方法 | 说明 |
---|---|---|
void | setOnCompassClickedListener (TencentMap.OnCompassClickedListener onCompassClickedListener) |
设置罗盘位按钮监听接口 |
示例代码
通过 TencentMap
类实现UiSettings
类对象的实例化:
java
UiSettings uiSettings = map.getUiSettings();
- Logo
java
// 设置Logo的显示位置
int logoAnchor = TencentMapOptions.LOGO_POSITION_BOTTOM_LEFT;
uiSettings.setLogoPosition(logoAnchor);
- 指南针
java
// 获取当前是否开启罗盘控件
boolean enabled = uiSettings.isCompassEnabled();
// 设置是否显示指南针
uiSettings.setCompassEnabled(true);
int xPadding = 20;
int yPadding = 20;
// 设置罗盘的填边
uiSettings.setCompassExtraPadding(xPadding, yPadding);
- 比例尺
java
// 获取当前是否显示比例尺
boolean isShow = uiSettings.isScaleViewEnabled();
// 设置当前是否显示比例尺
uiSettings.setScaleViewEnabled(true);
// 设置比例尺是否淡出
uiSettings.setScaleViewFadeEnable(false);
// 设置比例尺的显示位置
int position = TencentMapOptions.LOGO_POSITION_BOTTOM_LEFT;
uiSettings.setScaleViewPosition(position);
- 定位按钮
java
// 获取当前是否显示定位控件
boolean isShow = uiSettings.isMyLocationButtonEnabled();
// 设置是否显示定位按钮
uiSettings.setMyLocationButtonEnabled(true);
效果图
地图手势
腾讯地图SDK支持多种手势,比如单指按下、单指抬起、单指点击、单指双击、单指长按、滑动、滚动、缩放、倾斜、旋转等手势,还有包含一些组合手势,比如双击放大地图、双指单击缩小地图、单指双击上下滑动缩放地图等。
地图手势方法说明
手势 | 说明 | 状态开关 | 默认 |
---|---|---|---|
平移 | 单指长按, 用手指拖动地图四处滚动平移 | 可禁用或开启 | 开启 |
滑动 | 单指滑动, 用手指滑动地图,显示动画效果 | 可禁用或开启 | 开启 |
缩放 | 1.单指双击 2.双指单击 3.单指双击长按屏幕上下滑动, 缩放手势可改变地图的缩放级别 | 可禁用或开启 | 开启 |
倾斜 | 双指长按屏幕上下滑动, 通过两个手指的移动,控制地图的倾斜角 | 可禁用或开启 | 开启 |
旋转 | 双指长按屏幕左右交替旋转 通过两个手指控制,旋转3D地图 | 可禁用或开启 | 开启 |
地图手势开关
地图手势可以通过UiSetting
类提供的接口来控制禁用或启用。
UiSetting
类中获取地图手势是否可用的接口:
类型 | 方法 | 说明 |
---|---|---|
boolean | isScrollGesturesEnabled () |
获取当前是否支持滚动手势 |
boolean | isZoomGesturesEnabled () |
获取当前是否支持缩放手势 |
boolean | isTiltGesturesEnabled () |
获取当前是否支持倾斜手势 |
boolean | isRotateGesturesEnabled () |
获取当前是否支持旋转手势 |
UiSetting
类中设置地图手势是否可用的接口:
类型 | 方法 | 说明 |
---|---|---|
void | setFlingGestureEnabled (boolean flag) |
设置是否开启地图滑动手势 |
void | setScrollGesturesEnabled (boolean flag) |
设置是否开启地图滚动手势 |
void | setZoomGesturesEnabled (boolean flag) |
设置是否开启地图缩放手势 |
void | setTiltGesturesEnabled (boolean flag) |
设置是否开启地图倾斜手势 |
void | setRotateGesturesEnabled (boolean flag) |
设置是否开启地图旋转手势 |
void | setAllGesturesEnabled (boolean flag) |
设置是否开启地图所有手势 |
地图手势事件
TencentMap
类地图手势事件监听接口:
类型 | 方法 | 说明 |
---|---|---|
void | setOnMapClickListener (TencentMap.OnMapClickListener onMapClickListener) |
设置地图点击事件的监听接口 |
void | setOnMapLongClickListener (TencentMap.OnMapLongClickListener onMapLongClickListener) |
设置地图长按事件的监听接口 |
void | addTencentMapGestureListener (TencentMapGestureListener listener) |
添加一个腾讯地图手势监听接口 |
void | removeTencentMapGestureListener (TencentMapGestureListener listener) |
移除一个腾讯地图手势监听接口 |
当地图被点击时回调接口
java
// 当地图被点击时回调接口
public interface OnMapClickListener {
/**
* 当地图被点击时的回调函数
* @param latlng 点击点的经纬度
*/
void onMapClick(LatLng latlng);
}
当地图被长按时回调接口
java
// 当地图被长按时回调接口
public interface OnMapLongClickListener {
/**
* 当地图被长按时的回调函数
* @param latlng 按住点的经纬度
*/
void onMapLongClick(LatLng latlng);
}
地图手势识别的回调
java
// 地图手势识别的回调
public interface TencentMapGestureListener {
/**
* 单指双击
* @param x 像素 x坐标
* @param y 像素 y坐标
* @return
*/
boolean onDoubleTap(float x, float y);
/**
* 单指单击
* @param x 像素 x坐标
* @param y 像素 y坐标
* @return
*/
boolean onSingleTap(float x, float y);
/**
* 单指惯性滑动
* @param velocityX 惯性滑动的水平速度
* @param velocityY 惯性滑动的垂直速度
* @return
*/
boolean onFling(float velocityX, float velocityY);
/**
* 单指滑动
* @param distanceX 滑动的水平距离
* @param distanceY 滑动的垂直距离
* @return
*/
boolean onScroll(float distanceX, float distanceY);
/**
* 长按
* @param x 像素 x坐标
* @param y 像素 y坐标
* @return
*/
boolean onLongPress(float x, float y);
/**
* 单指按下
* @param x 像素 x坐标
* @param y 像素 y坐标
* @return
*/
boolean onDown(float x, float y);
/**
* 单指抬起
* @param x 像素 x坐标
* @param y 像素 y坐标
* @return
*/
boolean onUp(float x, float y);
/**
* 地图稳定下来
*/
void onMapStable();
}
地图状态
地图状态类
CameraPosition
类定义了地图的状态,如中心点经纬度,缩放级别,旋转角度,俯视角度等。
类型 | 方法 | 说明 |
---|---|---|
LatLng | target |
目标经纬度 |
float | zoom |
缩放级别 |
float | bearing |
旋转角度 |
float | tilt |
倾斜角度 |
CameraPosition
类中的方法:
类型 | 方法 | 说明 |
---|---|---|
- | CameraPosition (LatLng latlng, float zoomLevel, float skew, float rotate) |
构造一个 CameraPosition |
static CameraPosition | fromLatLngZoom (LatLng latlng, float zoomLevel) |
创建一个 CameraPosition |
static CameraPosition.Builder | builder () |
创建一个 CameraPosition.Builder |
static CameraPosition.Builder | builder (CameraPosition cameraposition) |
由一个 CameraPosition 对象创建一个 CameraPosition.Builder |
地图状态构造类
CameraPosition.Builder
类创建一个CameraPosition
的位置。
类型 | 方法 | 说明 |
---|---|---|
CameraPosition.Builder | target (LatLng latlng) |
地图目标经纬度 |
CameraPosition.Builder | zoom (float zoomLevel) |
地图的目标缩放级别 |
CameraPosition.Builder | bearing (float rotate) |
旋转角度 |
CameraPosition.Builder | tilt (float skew) |
倾斜角度 |
CameraPosition | build () |
构造一个CameraPosition 对象。 |
地图状态更新类
CameraUpdate
类描述地图状态将要发生的变化。
通过CameraUpdateFactory
类构建地图缩放等级、地图显示范围,改变地图中心点等地图更新实例。
类型 | 方法 | 说明 |
---|---|---|
static CameraUpdate | newCameraPosition (CameraPosition cameraposition) |
由一个CameraPosition来生成新的状态变化对象 |
static CameraUpdate | newLatLng (LatLng latlng) |
生成一个把地图移动到指定的经纬度到屏幕中心的状态变化对象 |
static CameraUpdate | newLatLngBounds (LatLngBounds latlngbounds, int padding) |
把地图移到到以指定的经纬度范围的,并且在这个范围四周加上padding像素的填充。 |
static CameraUpdate | newLatLngBoundsRect (LatLngBounds latlngbounds, int leftPadding, int rightPadding, int topPadding, int bottomPadding) |
把地图移动到指定经纬度范围,以适应当前屏幕的显示,并且可以为上下左右分别设置填充的像素 |
static CameraUpdate | newLatLngBoundsWithMapCenter (LatLngBounds latLngBounds, LatLng mapCenter, int padding) |
以mapCenter为中心,将latLngBounds对应的区域刚好缩放到可视区域内,并且在这个范围四周加上padding像素填充 |
static CameraUpdate | newLatLngZoom (LatLng latlng, float zoom) |
把地图以latlng为中心,以zoom为缩放级别,移到屏幕中心 |
static CameraUpdate | rotateTo (float rotate, float skew) |
将地图顺时针旋转rotate度,并且向后倾斜skew度 |
static CameraUpdate | scrollBy (float xPixel, float yPixel) |
将地图向左下移动xPixel和yPexil像素 |
static CameraUpdate | zoomBy (float zoomLevelDelta) |
在当前的缩放级别下,把缩放级别变化zoomLevelDelta,如果超出了范围,则停止在范围内 |
static CameraUpdate | zoomBy (float zoomLevelDelta, android.graphics.Point point) |
在当前的缩放级别下,把缩放级别变化zoomLevelDelta,如果超出了范围,则停止在范围内 注:因为依赖于MapView的尺寸,所以在onCreate中直接调用会有问题,可以放在OnMapLoadedCallback中调用 |
static CameraUpdate | zoomIn () |
把地图放大一级 注:执行放zoomIn操作需要获取当前地图状态,如果必须要在onCreate中调用,需要放在OnMapLoadedCallback中执行。 |
static CameraUpdate | zoomOut () |
把地图缩小一级 注:执行放zoomOut操作需要获取当前地图状态,如果必须要在onCreate中调用,需要放在OnMapLoadedCallback中执行。 |
static CameraUpdate | zoomTo (float zoomLevel) |
把地图缩放到目标级别 |
改变地图状态接口
TencentMap
类中改变地图状态和设置地图状态监听的接口:
类型 | 方法 | 说明 |
---|---|---|
void | moveCamera (CameraUpdate cameraUpdate) |
把地图变换到指定的状态 |
void | animateCamera (CameraUpdate cameraUpdate) |
把地图变换到指定的状态,带动画 |
void | animateCamera (CameraUpdate cameraUpdate, long duration, TencentMap.CancelableCallback cancelableCallback) |
以动画的方式把地图变换到指定的状态 |
void | animateCamera (CameraUpdate cameraUpdate, TencentMap.CancelableCallback cancelableCallback) |
以动画的方式把地图变换到指定的状态 |
void | setOnCameraChangeListener (TencentMap.OnCameraChangeListener onCameraChangeListener) |
设置地图变换的监听接口 |
当地图发生变化时的调用接口
java
// 当地图发生变化时的调用接口
public interface OnCameraChangeListener {
/**
* 地图状态发生变化
* @param cameraPosition 地图当前的状态对象
*/
void onCameraChange(CameraPosition cameraPosition);
/**
* 地图状态变化结束
* @param cameraPosition 地图当前的状态对象
*/
void onCameraChangeFinished(CameraPosition cameraPosition);
}
地图变换相关操作的状态回调接口
java
// 地图变换相关操作的状态回调接口
public interface CancelableCallback {
/**
* 地图变换结束
*/
void onFinish();
/**
* 地图变换被取消
*/
void onCancel();
}
限制地图显示范围和缩放级别
腾讯地图 SDK 支持将地图限制在指定的经纬度范围内,即只能在一定区域内缩放、移动地图视野。
显示范围适配模式
常量 | 说明 |
---|---|
FIT_HEIGHT |
此模式会以 bounds 高度为参考值限制地图的控制区域,在最小限制级别时 bounds 的横向区域可能显示不完整, 可调用 TencentMap.setMinZoomLevel(int) 修改最小限制级别以展示完整的区域 |
FIT_WIDTH |
此模式会以 bounds 宽度为参考值限制地图的控制区域,在最小限制级别时 bounds 的纵向区域可能显示不完整, 可调用 TencentMap.setMinZoomLevel(int) 修改最小限制级别以展示完整的区域 |
接口
TencentMap
类中限制地图显示范围和缩放级别的接口:
类型 | 方法 | 说明 |
---|---|---|
void | setRestrictBounds (LatLngBounds restrictBounds, RestrictBoundsFitMode fitMode) |
限制地图的显示范围。 |
float | getMaxZoomLevel () |
获取地图最大的支持的缩放级别 |
float | getMinZoomLevel () |
获取地图最小的支持的缩放级别 |
void | setMaxZoomLevel (int zoomLevel) |
设置地图的最大缩放级别 |
void | setMinZoomLevel (int zoomLevel) |
设置地图的最小缩放级别 |
- 说明:限制地图的显示范围。此接口同时会限制地图的最小缩放整数级别,用户还可以通过
setMinZoomLevel(int)
修改自己需要的最小缩放级别获取需要的展示效果。这个方法只有在 OnMapLoadedCallback 回调后才能正常使用。
地图事件
TencentMap
类中加载完成和渲染完成的接口:
类型 | 方法 | 说明 |
---|---|---|
void | addOnMapLoadedCallback (TencentMap.OnMapLoadedCallback onMapLoadedCallback) |
设置地图加载完成回调接口 |
void | setOnMapFrameFinished (TencentMap.OnMapFrameFinishCallback onMapFrameFinished) |
设置地图渲染帧回调 |
##地图加载完成的回调接口
java
// 地图加载完成的回调接口,设置之后只回调一次,如果需要再获取,则需要重新设置回调
public interface OnMapLoadedCallback {
/**
* 地图加载完成回调函数
*/
void onMapLoaded();
}
地图完成首屏渲染回调接口
java
// 地图完成首屏渲染回调,仅依赖当前资源的渲染完成
public interface OnMapFrameFinishCallback {
/**
* 地图渲染首屏开始
*/
void onMapFrameStart();
/**
* 地图渲染首屏完成
*/
void onMapFrameFinished();
}