/*
* Copyright (c) 2017 Daimler AG / Moovel GmbH
*
* All rights reserved
*/
package com.car2go.maps.baidu;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.car2go.maps.CameraUpdate;
import com.car2go.maps.baidu.model.BaiduCameraUpdate;
import com.car2go.maps.baidu.model.ModelToBaiduConverter;
import com.car2go.maps.model.CameraPosition;
import com.car2go.maps.model.LatLng;
/**
* Controls incoming {@link CameraUpdate} events
*/
public class CameraUpdateController {
private final BaiduMap map;
public CameraUpdateController(com.baidu.mapapi.map.BaiduMap map) {
this.map = map;
}
/**
* Changes the current map status with the given parameters.
*
* @param baiduCameraUpdate the camera update to perform
* @param animate set to true, if the change should be animated
* @param duration the animation duration, may be null to use the default
*/
public void animateMapStatus(BaiduCameraUpdate baiduCameraUpdate, boolean animate, Integer duration) {
if (baiduCameraUpdate.bounds == null && baiduCameraUpdate.center == null && baiduCameraUpdate.zoom == null) {
throw new IllegalArgumentException("We either need a center, some bounds or a zoom in order to animate.");
}
MapStatusUpdate mapStatusUpdate;
if (baiduCameraUpdate.bounds != null) {
// Zoom to given bounds
mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(ModelToBaiduConverter.convert(baiduCameraUpdate.bounds));
} else if (baiduCameraUpdate.center == null) {
// Just zoom in or out
mapStatusUpdate = MapStatusUpdateFactory.zoomTo(baiduCameraUpdate.zoom);
} else if (baiduCameraUpdate.zoom != null) {
// Go to the new center & zoom
mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(ModelToBaiduConverter.convert(baiduCameraUpdate.center), baiduCameraUpdate.zoom);
} else {
// Just go to the new center
mapStatusUpdate = MapStatusUpdateFactory.newLatLng(ModelToBaiduConverter.convert(baiduCameraUpdate.center));
}
if (!animate) {
map.setMapStatus(mapStatusUpdate);
} else if (duration == null) {
map.animateMapStatus(mapStatusUpdate);
} else {
map.animateMapStatus(mapStatusUpdate, duration);
}
}
/**
* Gets the current camera position.
*
* @return the camera position
*/
public CameraPosition currentCameraPosition() {
MapStatus mapStatus = map.getMapStatus();
return new CameraPosition(
new LatLng(mapStatus.target.latitude, mapStatus.target.longitude),
mapStatus.zoom
);
}
}