您可以通过控制内置UI控件的显示以及允许哪些手势来自定义用户与地图交互的方式。参考示例代码工程中的CameraDemoActivity.java、GestureDemoActivity.java、GestureControlsDemoActivity.java等文件,示例代码下载。
相机包含以下4个属性:
| 属性 | 属性描述 |
| target | 地图中心位置的经纬度坐标。 |
| bearing | 地图以正北方向为0度顺时针旋转的角度。 |
| tilt | 相机的倾斜角度,即相机角度与垂直于地球表面直线的夹角。 |
| zoom | 屏幕中心附近的缩放级别。 |
华为地图的移动是通过模拟相机移动的方式实现的,开发者可以通过改变相机位置,来控制地图的可见区域。开发者要更改相机位置时,可以通过CameraUpdateFactory创建不同类型的CameraUpdate,然后再去移动相机。
创建CameraUpdate对象的方式
- //方式1:相机放大级数加1,保持其他属性不变
- CameraUpdate cameraUpdate = CameraUpdateFactory.zoomIn();
- //方式2:相机放大级数减1,保持其他属性不变
- CameraUpdate cameraUpdate1 = CameraUpdateFactory.zoomOut();
- //方式3:指定相机缩放级数zoom值,其他属性不变
- float zoom = 8.0f;
- CameraUpdate cameraUpdate2 = CameraUpdateFactory.zoomTo(zoom);
- //方式4:指定相机缩放级别增量amount,开发者调用此方法可以在原来相机的缩放级别之上,进行适当的缩放
- float amount = 2.0f;
- CameraUpdate cameraUpdate3 = CameraUpdateFactory.zoomBy(amount);
- //方式5:指定缩放级别增量和一个中心点,开发者调用此API可以移动相机至中心点位置,并进行缩放
- //屏幕坐标点
- Point point = new Point(31, 118);
- float amount = 2.0f;
- CameraUpdate cameraUpdate4 = CameraUpdateFactory.zoomBy(amount, point);
- //方式6:设置相机的经纬度,其他参数不变
- LatLng latLng1 = new LatLng(31.5, 118.9);
- CameraUpdate cameraUpdate5 = CameraUpdateFactory.newLatLng(latLng1);
- //方式7:设置相机的可见区域,和到边界的距离
- int padding = 100;
- LatLng latLng1 = new LatLng(31.5, 118.9);
- LatLng latLng2 = new LatLng(32.5, 119.9);
- LatLngBounds latLngBounds = new LatLngBounds(latLng1, latLng2);
- CameraUpdate cameraUpdate6 = CameraUpdateFactory.newLatLngBounds(latLngBounds, padding);
- //方式8:设置相机的中心点位置和缩放级数
- float zoom = 0.0f;
- LatLng latLng2 = new LatLng(32.5, 119.9);
- CameraUpdate cameraUpdate7 = CameraUpdateFactory.newLatLngZoom(latLng2, zoom);
- //方式9:滚动相机,将相机按照指定的像素点移动
- float x = 100.0f;
- float y = 100.0f;
- CameraUpdate cameraUpdate8 = CameraUpdateFactory.scrollBy(x, y);
- //方式10:指定相机位置
- //倾斜度
- float tilt = 2.2f;
- //方向
- float bearing = 31.5f;
- CameraPosition cameraPosition = new CameraPosition(latLng1,zoom,tilt,bearing);
- CameraUpdate cameraUpdate9 = CameraUpdateFactory.newCameraPosition(cameraPosition);
移动相机的方式
您可以选择以动画方式或非动画方式移动相机。
以动画方式移动相机时,您还可以设置动画停止时的回调接口和动画持续的时间。默认动画持续时间为250毫秒。
以非动画方式移动相机是瞬时完成的。
- //以动画方式移动地图相机
- hMap.animateCamera(CameraUpdate);
- //以动画方式移动地图相机,并设置动画停止时的回调接口
- hMap.animateCamera(CameraUpdate, CancelableCallback);
- //以动画方式移动地图相机,并设置动画停止时的回调接口和动画持续的时间
- hMap.animateCamera(CameraUpdate, int, CancelableCallback);
- //以非动画方式移动地图相机
- hMap.moveCamera(CameraUpdate);
设置相机最大/最小偏好缩放级别
- //设置最小偏好缩放级别
- hMap.setMinZoomPreference(float);
- //设置最大偏好缩放级别
- hMap.setMaxZoomPreference(float);
- //重置最大最小缩放级别
- hMap.resetMinMaxZoomPreference();

图1:指定相机位置前

图2:指定相机位置后
华为地图SDK支持设置地图相机的边界。通过setLatLngBoundsForCameraTarget(LatLngBounds)接口指定一个LatLngBounds来约束相机目标,使用户漫游地图时,相机目标不会移出此边界。当设置参数为空时,地图相机的边界清除。
开发者可以通过调用HuaweiMap类中的getUiSettings()方法获取到UiSettings对象,该类支持控制UI控件的可见性。UI控件主要包括:缩放控件、指南针、“我的位置”按钮、“地图手势”。
缩放控制器
华为地图SDK提供了内置的缩放控件,默认情况下是开启的。
- //缩放控件控制开关
- hMap.getUiSettings().setZoomControlsEnabled(false);
指南针
华为地图SDK提供了指南针功能,默认显示在地图的右上角。如果启用,当地图不是指向正北方向时,地图右上角会显示一个指南针图标,点击指南针可使地图旋转为正北方向;当地图为正北方向时,指南针图标隐藏。如果禁用,将永远不会显示指南针图标。
- //指南针控制开关
- hMap.getUiSettings().setCompassEnabled(false);
“我的位置”按钮
启用我的位置按钮之前,您需要确保已经开启了android.permission.ACCESS_FINE_LOCATION和android.permission.ACCESS_COARSE_LOCATION权限,以及开启了“我的位置”图层。当启用了“我的位置”按钮功能时,该按钮才会显示在地图上。
- //"我的位置"图层开关
- hMap.setMyLocationEnabled(true);
- //"我的位置"按钮显示开关
- hMap.getUiSettings().setMyLocationButtonEnabled(true);
地图手势控制
开发者可以通过UISettings对象来启用或禁止相关的地图手势。
缩放手势:双击可将缩放级别提高1(放大),用两根手指点击可将缩放级别降低1(缩小)。
- //缩放手势控制开关
- hMap.getUiSettings().setZoomGesturesEnabled(true);
滚动平移手势:用户可以通过用手指拖动地图来进行移动。
- //移动手势控制开关
- hMap.getUiSettings().setScrollGesturesEnabled(true);
倾斜手势:用户可以将两个手指在地图上进行向下或向上移动来改变地图的倾斜度。
- //倾斜手势控制开关
- hMap.getUiSettings().setTiltGesturesEnabled(true);
旋转手势:用户可以通过将两个手指放在地图上旋转来旋转地图。
- //旋转手势控制开关
- hMap.getUiSettings().setRotateGesturesEnabled(true);
本章节包含地图的点击和长按、相机移动、以及“我的位置”按钮点击等事件监听。
单击事件监听:
- hMap.setOnMapClickListener(new HuaweiMap.OnMapClickListener() {
- @Override
- public void onMapClick(LatLng latLng) {
- Toast.makeText(getApplicationContext(), "onMapClick:" + latLng.toString(), Toast.LENGTH_SHORT).show();
- }
- });
长按事件监听:
- hMap.setOnMapLongClickListener(new HuaweiMap.OnMapLongClickListener() {
- @Override
- public void onMapLongClick(LatLng latLng) {
- Toast.makeText(getApplicationContext(), "onMapLongClick:" + latLng.toString(), Toast.LENGTH_SHORT).show();
- }
- });
相机移动时,应用层通过设置监听器,能够对相机移动状态进行监听。
当相机开始移动时,将调用HuaweiMap.OnCameraMoveStartedListener的onCameraMoveStarted()方法进行回调。
当相机移动或用户与触摸屏交互时,会多次调用HuaweiMap.OnCameraMoveListener的onCameraMove()方法。
当相机停止移动时,将调用HuaweiMap.OnCameraIdleListener的OnCameraIdle()方法。
- @Override
- public void onMapReady(HuaweiMap huaweiMap) {
- Log.i(TAG, "onMapReady: ");
- hMap = huaweiMap;
- hMap.setMyLocationEnabled(true);
- hMap.setOnCameraMoveStartedListener(this);
- hMap.setOnCameraIdleListener(this);
- hMap.setOnCameraMoveListener(this);
- hMap.setOnMapLoadedCallback(new HuaweiMap.OnMapLoadedCallback() {
- @Override
- public void onMapLoaded() {
- Log.i(TAG, "onMapLoaded: successful");
- }
- });
- }
- //相机开始移动时回调
- @Override
- public void onCameraMoveStarted(int reason) {
- Log.i(TAG, "onCameraMoveStarted: successful");
- }
- //相机移动终止时的回调
- @Override
- public void onCameraIdle() {
- Log.i(TAG, "onCameraIdle: successful");
- }
- //相机移动过程中的回调
- @Override
- public void onCameraMove() {
- Log.i(TAG, "onCameraMove: successful");
- }
标记点击事件监听:
- hMap.setOnMarkerClickListener(new HuaweiMap.OnMarkerClickListener() {
- @Override
- public boolean onMarkerClick(Marker marker) {
- Toast.makeText(getApplicationContext(), "onMarkerClick:" + marker.getTitle(), Toast.LENGTH_SHORT).show();
- return false;
- }
- });
窗口点击事件监听:
- hMap.setOnInfoWindowClickListener(new HuaweiMap.OnInfoWindowClickListener() {
- @Override
- public void onInfoWindowClick(Marker marker) {
- Toast.makeText(getApplicationContext(), "onInfoWindowClick:" + marker.getTitle(), Toast.LENGTH_SHORT).show();
- }
- });
“我的位置”按钮点击事件监听:
- hMap.setOnMyLocationButtonClickListener(new HuaweiMap.OnMyLocationButtonClickListener() {
- @Override
- public boolean onMyLocationButtonClick() {
- Toast.makeText(getApplicationContext(), "MyLocation button clicked", Toast.LENGTH_SHORT).show();
- return false;
- }
- });