腾讯地图SDK Android版开发 5 地图交互操作

前言

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

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

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

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

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

控件介绍

控件介绍

腾讯地图提供一些基础的地图控件,包括LOGO、指南针、比例尺、定位按钮。

控件功能默认显示默认位置
LOGO可设置显示相对位置(左下,中下,右下,左上,中上,右上)
设置Logo的缩放比例
显示右下角
指南针设置是否显示,设置罗盘的填边不显示左上角
比例尺设置是否显示,设置比例尺是否淡出,设置比例尺的显示相对位置位置不显示左下角
定位按钮设置是否显示不显示右下角

接口

UiSettings 类用于操控地图控件,以定制自己想要的视图效果。UiSettings类中地图控件的接口:

  • LOGO
类型方法说明
voidsetLogoPosition(int logoAnchor)设置Logo的显示位置
voidsetLogoPosition(int logoAnchor, int[] marginParams)根据地图四个Anchor 模式(左上、左下、右下、右上)以及相应的Margins来设置Logo位置
voidsetLogoPositionWithMargin(int position, int top, int bottom, int left, int right)设置Logo的显示位置,带偏移量,单位像素 设置Logo的显示位置
voidsetLogoScale(float logoScale)设置Logo的缩放比例,比例范围(0.7~1.3)
voidsetLogoSize(int logoSize)设置图标大小,暂时不生效
  • 指南针
类型方法说明
booleanisCompassEnabled()获取当前是否开启罗盘控件
voidsetCompassEnabled(boolean flag)设置是否显示指南针
voidsetCompassExtraPadding(int xPadding, int yPadding)设置罗盘的填边
voidsetCompassExtraPadding(int padding)设置罗盘的填边,只对Y轴生效
  • 比例尺
类型方法说明
booleanisScaleViewEnabled()获取当前是否显示比例尺
voidsetScaleViewEnabled(boolean show)设置当前是否显示比例尺
voidsetScaleViewFadeEnable(boolean enable)设置比例尺是否淡出
voidsetScaleViewPosition(int position)设置比例尺的显示位置
voidsetScaleViewPositionWithMargin(int position, int top, int bottom, int left, int right)设置比例尺的显示位置,带偏移量,单位像素
  • 定位按钮
类型方法说明
booleanisMyLocationButtonEnabled()获取当前是否显示定位控件
voidsetMyLocationButtonEnabled(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 interfaceTencentMap.OnCompassClickedListener当地图的罗盘被点击时的回调接口
static interfaceTencentMap.OnMyLocationClickListener点击我的位置时的回调接口
类型方法说明
voidsetOnCompassClickedListener(TencentMap.OnCompassClickedListener onCompassClickedListener)设置罗盘位按钮监听接口

示例代码

通过 TencentMap 类实现UiSettings 类对象的实例化:

UiSettings uiSettings = map.getUiSettings();
  • Logo
// 设置Logo的显示位置
int logoAnchor = TencentMapOptions.LOGO_POSITION_BOTTOM_LEFT;
uiSettings.setLogoPosition(logoAnchor);
  • 指南针
// 获取当前是否开启罗盘控件
boolean enabled = uiSettings.isCompassEnabled();
// 设置是否显示指南针
uiSettings.setCompassEnabled(true);

int xPadding = 20;
int yPadding = 20;
// 设置罗盘的填边
uiSettings.setCompassExtraPadding(xPadding, yPadding);
  • 比例尺
// 获取当前是否显示比例尺
boolean isShow = uiSettings.isScaleViewEnabled();
// 设置当前是否显示比例尺
uiSettings.setScaleViewEnabled(true);
// 设置比例尺是否淡出
uiSettings.setScaleViewFadeEnable(false);

// 设置比例尺的显示位置
int position = TencentMapOptions.LOGO_POSITION_BOTTOM_LEFT;
uiSettings.setScaleViewPosition(position);
  • 定位按钮
// 获取当前是否显示定位控件
boolean isShow = uiSettings.isMyLocationButtonEnabled();
// 设置是否显示定位按钮
uiSettings.setMyLocationButtonEnabled(true);

效果图

在这里插入图片描述

地图手势

腾讯地图SDK支持多种手势,比如单指按下、单指抬起、单指点击、单指双击、单指长按、滑动、滚动、缩放、倾斜、旋转等手势,还有包含一些组合手势,比如双击放大地图、双指单击缩小地图、单指双击上下滑动缩放地图等。

地图手势方法说明

手势说明状态开关默认
平移单指长按,
用手指拖动地图四处滚动平移
可禁用或开启开启
滑动单指滑动,
用手指滑动地图,显示动画效果
可禁用或开启开启
缩放1.单指双击 2.双指单击 3.单指双击长按屏幕上下滑动,
缩放手势可改变地图的缩放级别
可禁用或开启开启
倾斜双指长按屏幕上下滑动,
通过两个手指的移动,控制地图的倾斜角
可禁用或开启开启
旋转双指长按屏幕左右交替旋转
通过两个手指控制,旋转3D地图
可禁用或开启开启

地图手势开关

地图手势可以通过UiSetting类提供的接口来控制禁用或启用。

UiSetting类中获取地图手势是否可用的接口:

类型方法说明
booleanisScrollGesturesEnabled()获取当前是否支持滚动手势
booleanisZoomGesturesEnabled()获取当前是否支持缩放手势
booleanisTiltGesturesEnabled()获取当前是否支持倾斜手势
booleanisRotateGesturesEnabled()获取当前是否支持旋转手势

UiSetting类中设置地图手势是否可用的接口:

类型方法说明
voidsetFlingGestureEnabled(boolean flag)设置是否开启地图滑动手势
voidsetScrollGesturesEnabled(boolean flag)设置是否开启地图滚动手势
voidsetZoomGesturesEnabled(boolean flag)设置是否开启地图缩放手势
voidsetTiltGesturesEnabled(boolean flag)设置是否开启地图倾斜手势
voidsetRotateGesturesEnabled(boolean flag)设置是否开启地图旋转手势
voidsetAllGesturesEnabled(boolean flag)设置是否开启地图所有手势

地图手势事件

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

类型方法说明
voidsetOnMapClickListener(TencentMap.OnMapClickListener onMapClickListener)设置地图点击事件的监听接口
voidsetOnMapLongClickListener(TencentMap.OnMapLongClickListener onMapLongClickListener)设置地图长按事件的监听接口
voidaddTencentMapGestureListener(TencentMapGestureListener listener)添加一个腾讯地图手势监听接口
voidremoveTencentMapGestureListener(TencentMapGestureListener listener)移除一个腾讯地图手势监听接口

当地图被点击时回调接口

// 当地图被点击时回调接口
public interface OnMapClickListener {
    /**
     * 当地图被点击时的回调函数
     * @param latlng 点击点的经纬度
     */
    void onMapClick(LatLng latlng);
}

当地图被长按时回调接口

// 当地图被长按时回调接口
public interface OnMapLongClickListener {
    /**
     * 当地图被长按时的回调函数
     * @param latlng 按住点的经纬度
     */
    void onMapLongClick(LatLng latlng);
}

地图手势识别的回调

// 地图手势识别的回调
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类定义了地图的状态,如中心点经纬度,缩放级别,旋转角度,俯视角度等。

类型方法说明
LatLngtarget目标经纬度
floatzoom缩放级别
floatbearing旋转角度
floattilt倾斜角度

CameraPosition类中的方法:

类型方法说明
-CameraPosition(LatLng latlng, float zoomLevel, float skew, float rotate)构造一个 CameraPosition
static CameraPositionfromLatLngZoom(LatLng latlng, float zoomLevel)创建一个 CameraPosition
static CameraPosition.Builderbuilder()创建一个 CameraPosition.Builder
static CameraPosition.Builderbuilder(CameraPosition cameraposition)由一个 CameraPosition 对象创建一个 CameraPosition.Builder

地图状态构造类

CameraPosition.Builder类创建一个CameraPosition的位置。

类型方法说明
CameraPosition.Buildertarget(LatLng latlng)地图目标经纬度
CameraPosition.Builderzoom(float zoomLevel)地图的目标缩放级别
CameraPosition.Builderbearing(float rotate)旋转角度
CameraPosition.Buildertilt(float skew)倾斜角度
CameraPositionbuild()构造一个CameraPosition 对象。

地图状态更新类

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

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

类型方法说明
static CameraUpdatenewCameraPosition(CameraPosition cameraposition)由一个CameraPosition来生成新的状态变化对象
static CameraUpdatenewLatLng(LatLng latlng)生成一个把地图移动到指定的经纬度到屏幕中心的状态变化对象
static CameraUpdatenewLatLngBounds(LatLngBounds latlngbounds, int padding)把地图移到到以指定的经纬度范围的,并且在这个范围四周加上padding像素的填充。
static CameraUpdatenewLatLngBoundsRect(LatLngBounds latlngbounds, int leftPadding, int rightPadding, int topPadding, int bottomPadding)把地图移动到指定经纬度范围,以适应当前屏幕的显示,并且可以为上下左右分别设置填充的像素
static CameraUpdatenewLatLngBoundsWithMapCenter(LatLngBounds latLngBounds, LatLng mapCenter, int padding)以mapCenter为中心,将latLngBounds对应的区域刚好缩放到可视区域内,并且在这个范围四周加上padding像素填充
static CameraUpdatenewLatLngZoom(LatLng latlng, float zoom)把地图以latlng为中心,以zoom为缩放级别,移到屏幕中心
static CameraUpdaterotateTo(float rotate, float skew)将地图顺时针旋转rotate度,并且向后倾斜skew度
static CameraUpdatescrollBy(float xPixel, float yPixel)将地图向左下移动xPixel和yPexil像素
static CameraUpdatezoomBy(float zoomLevelDelta)在当前的缩放级别下,把缩放级别变化zoomLevelDelta,如果超出了范围,则停止在范围内
static CameraUpdatezoomBy(float zoomLevelDelta, android.graphics.Point point)在当前的缩放级别下,把缩放级别变化zoomLevelDelta,如果超出了范围,则停止在范围内 注:因为依赖于MapView的尺寸,所以在onCreate中直接调用会有问题,可以放在OnMapLoadedCallback中调用
static CameraUpdatezoomIn()把地图放大一级 注:执行放zoomIn操作需要获取当前地图状态,如果必须要在onCreate中调用,需要放在OnMapLoadedCallback中执行。
static CameraUpdatezoomOut()把地图缩小一级 注:执行放zoomOut操作需要获取当前地图状态,如果必须要在onCreate中调用,需要放在OnMapLoadedCallback中执行。
static CameraUpdatezoomTo(float zoomLevel)把地图缩放到目标级别

改变地图状态接口

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

类型方法说明
voidmoveCamera(CameraUpdate cameraUpdate)把地图变换到指定的状态
voidanimateCamera(CameraUpdate cameraUpdate)把地图变换到指定的状态,带动画
voidanimateCamera(CameraUpdate cameraUpdate, long duration, TencentMap.CancelableCallback cancelableCallback)以动画的方式把地图变换到指定的状态
voidanimateCamera(CameraUpdate cameraUpdate, TencentMap.CancelableCallback cancelableCallback)以动画的方式把地图变换到指定的状态
voidsetOnCameraChangeListener(TencentMap.OnCameraChangeListener onCameraChangeListener)设置地图变换的监听接口

当地图发生变化时的调用接口

// 当地图发生变化时的调用接口
public interface OnCameraChangeListener {
    /**
     * 地图状态发生变化
     * @param cameraPosition 地图当前的状态对象
     */
    void onCameraChange(CameraPosition cameraPosition);

    /**
     * 地图状态变化结束
     * @param cameraPosition 地图当前的状态对象
     */
    void onCameraChangeFinished(CameraPosition cameraPosition);
}

地图变换相关操作的状态回调接口

// 地图变换相关操作的状态回调接口
public interface CancelableCallback {
    /**
     * 地图变换结束
     */
    void onFinish();

    /**
     * 地图变换被取消
     */
    void onCancel();
}

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

腾讯地图 SDK 支持将地图限制在指定的经纬度范围内,即只能在一定区域内缩放、移动地图视野。

显示范围适配模式

常量说明
FIT_HEIGHT此模式会以 bounds 高度为参考值限制地图的控制区域,在最小限制级别时 bounds 的横向区域可能显示不完整, 可调用 TencentMap.setMinZoomLevel(int) 修改最小限制级别以展示完整的区域
FIT_WIDTH此模式会以 bounds 宽度为参考值限制地图的控制区域,在最小限制级别时 bounds 的纵向区域可能显示不完整, 可调用 TencentMap.setMinZoomLevel(int) 修改最小限制级别以展示完整的区域

接口

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

类型方法说明
voidsetRestrictBounds(LatLngBounds restrictBounds, RestrictBoundsFitMode fitMode)限制地图的显示范围。
floatgetMaxZoomLevel()获取地图最大的支持的缩放级别
floatgetMinZoomLevel()获取地图最小的支持的缩放级别
voidsetMaxZoomLevel(int zoomLevel)设置地图的最大缩放级别
voidsetMinZoomLevel(int zoomLevel)设置地图的最小缩放级别
  • 说明:限制地图的显示范围。此接口同时会限制地图的最小缩放整数级别,用户还可以通过 setMinZoomLevel(int) 修改自己需要的最小缩放级别获取需要的展示效果。这个方法只有在 OnMapLoadedCallback 回调后才能正常使用。

地图事件

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

类型方法说明
voidaddOnMapLoadedCallback(TencentMap.OnMapLoadedCallback onMapLoadedCallback)设置地图加载完成回调接口
voidsetOnMapFrameFinished(TencentMap.OnMapFrameFinishCallback onMapFrameFinished)设置地图渲染帧回调

##地图加载完成的回调接口

// 地图加载完成的回调接口,设置之后只回调一次,如果需要再获取,则需要重新设置回调
public interface OnMapLoadedCallback {
    /**
     * 地图加载完成回调函数
     */
    void onMapLoaded();
}

地图完成首屏渲染回调接口

// 地图完成首屏渲染回调,仅依赖当前资源的渲染完成
public interface OnMapFrameFinishCallback {
    /**
     * 地图渲染首屏开始
     */
    void onMapFrameStart();

    /**
     * 地图渲染首屏完成
     */
    void onMapFrameFinished();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值