Added animation while navigation
This commit is contained in:
parent
f7d58fca44
commit
9948bc131c
2 changed files with 72 additions and 13 deletions
|
@ -171,8 +171,10 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
||||||
if (mapView != null) {
|
if (mapView != null) {
|
||||||
RotatedTileBox tb = mapView.getCurrentRotatedTileBox();
|
RotatedTileBox tb = mapView.getCurrentRotatedTileBox();
|
||||||
if (isMapLinkedToLocation() && location != null) {
|
if (isMapLinkedToLocation() && location != null) {
|
||||||
|
Integer zoom = null;
|
||||||
|
Float rotation = null;
|
||||||
if (settings.AUTO_ZOOM_MAP.get()) {
|
if (settings.AUTO_ZOOM_MAP.get()) {
|
||||||
autozoom(location);
|
zoom = autozoom(location);
|
||||||
}
|
}
|
||||||
int currentMapRotation = settings.ROTATE_MAP.get();
|
int currentMapRotation = settings.ROTATE_MAP.get();
|
||||||
boolean smallSpeed = isSmallSpeedForCompass(location);
|
boolean smallSpeed = isSmallSpeedForCompass(location);
|
||||||
|
@ -183,14 +185,16 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
||||||
if (location.hasBearing() && !smallSpeed) {
|
if (location.hasBearing() && !smallSpeed) {
|
||||||
// special case when bearing equals to zero (we don't change anything)
|
// special case when bearing equals to zero (we don't change anything)
|
||||||
if (location.getBearing() != 0f) {
|
if (location.getBearing() != 0f) {
|
||||||
mapView.setRotate(-location.getBearing());
|
rotation = -location.getBearing();
|
||||||
|
//mapView.setRotate(-location.getBearing());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(currentMapRotation == OsmandSettings.ROTATE_MAP_COMPASS) {
|
} else if(currentMapRotation == OsmandSettings.ROTATE_MAP_COMPASS) {
|
||||||
showViewAngle = routePlanningMode; // disable compass rotation in that mode
|
showViewAngle = routePlanningMode; // disable compass rotation in that mode
|
||||||
}
|
}
|
||||||
registerUnregisterSensor(location);
|
registerUnregisterSensor(location);
|
||||||
mapView.setLatLon(location.getLatitude(), location.getLongitude());
|
mapView.getAnimatedDraggingThread().startMovingNav(location.getLatitude(), location.getLongitude(), zoom, rotation);
|
||||||
|
//mapView.setLatLon(location.getLatitude(), location.getLongitude());
|
||||||
} else if(location != null) {
|
} else if(location != null) {
|
||||||
showViewAngle = (!location.hasBearing() || isSmallSpeedForCompass(location)) && (tb != null &&
|
showViewAngle = (!location.hasBearing() || isSmallSpeedForCompass(location)) && (tb != null &&
|
||||||
tb.containsLatLon(location.getLatitude(), location.getLongitude()));
|
tb.containsLatLon(location.getLatitude(), location.getLongitude()));
|
||||||
|
@ -273,7 +277,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
||||||
return zoomDelta;
|
return zoomDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void autozoom(Location location) {
|
public Integer autozoom(Location location) {
|
||||||
if (location.hasSpeed()) {
|
if (location.hasSpeed()) {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
final RotatedTileBox tb = mapView.getCurrentRotatedTileBox();
|
final RotatedTileBox tb = mapView.getCurrentRotatedTileBox();
|
||||||
|
@ -298,11 +302,13 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
||||||
// round to 0.33
|
// round to 0.33
|
||||||
targetZoom = Math.round(targetZoom * 3) / 3f;
|
targetZoom = Math.round(targetZoom * 3) / 3f;
|
||||||
int newIntegerZoom = (int)Math.round(targetZoom);
|
int newIntegerZoom = (int)Math.round(targetZoom);
|
||||||
double zPart = targetZoom - newIntegerZoom;
|
//double zPart = targetZoom - newIntegerZoom;
|
||||||
mapView.getAnimatedDraggingThread().startZooming(newIntegerZoom, zPart, false);
|
//mapView.getAnimatedDraggingThread().startZooming(newIntegerZoom, zPart, false);
|
||||||
|
return newIntegerZoom;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return mapView.getZoom();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void backToLocationImpl() {
|
public void backToLocationImpl() {
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
package net.osmand.plus.views;
|
package net.osmand.plus.views;
|
||||||
|
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import android.view.animation.AccelerateDecelerateInterpolator;
|
||||||
|
import android.view.animation.DecelerateInterpolator;
|
||||||
|
import android.view.animation.LinearInterpolator;
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.core.android.MapRendererView;
|
import net.osmand.core.android.MapRendererView;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
@ -7,11 +12,6 @@ import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import android.os.SystemClock;
|
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator;
|
|
||||||
import android.view.animation.DecelerateInterpolator;
|
|
||||||
import android.view.animation.LinearInterpolator;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thread for animated dragging.
|
* Thread for animated dragging.
|
||||||
* Defines accelerator to stop dragging screen.
|
* Defines accelerator to stop dragging screen.
|
||||||
|
@ -116,6 +116,59 @@ public class AnimateDraggingMapThread {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void startMovingNav(final double finalLat, final double finalLon, final Integer finalZoom, final Float finalRotation){
|
||||||
|
stopAnimatingSync();
|
||||||
|
final RotatedTileBox rb = tileView.getCurrentRotatedTileBox().copy();
|
||||||
|
double startLat = rb.getLatitude();
|
||||||
|
double startLon = rb.getLongitude();
|
||||||
|
final int startZoom = rb.getZoom();
|
||||||
|
final double startZoomFP = rb.getZoomFloatPart();
|
||||||
|
final float startRotaton = rb.getRotate();
|
||||||
|
|
||||||
|
final float mMoveX = rb.getPixXFromLatLon(startLat, startLon) - rb.getPixXFromLatLon(finalLat, finalLon);
|
||||||
|
final float mMoveY = rb.getPixYFromLatLon(startLat, startLon) - rb.getPixYFromLatLon(finalLat, finalLon);
|
||||||
|
|
||||||
|
final float animationTime = Math.max(450, (Math.abs(mMoveX) + Math.abs(mMoveY)) / 1200f * MOVE_MOVE_ANIMATION_TIME);
|
||||||
|
|
||||||
|
final int zoom;
|
||||||
|
final float rotation;
|
||||||
|
if (finalZoom != null) {
|
||||||
|
zoom = finalZoom;
|
||||||
|
} else {
|
||||||
|
zoom = startZoom;
|
||||||
|
}
|
||||||
|
if (finalRotation != null) {
|
||||||
|
rotation = finalRotation;
|
||||||
|
} else {
|
||||||
|
rotation = startRotaton;
|
||||||
|
}
|
||||||
|
|
||||||
|
startThreadAnimating(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
setTargetValues(zoom, finalLat, finalLon);
|
||||||
|
if (zoom != startZoom || startZoomFP != 0) {
|
||||||
|
animatingZoomInThread(startZoom, startZoomFP, zoom, 0, ZOOM_MOVE_ANIMATION_TIME, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stopped){
|
||||||
|
animatingMoveInThread(mMoveX, mMoveY, animationTime, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stopped){
|
||||||
|
tileView.setLatLonAnimate(finalLat, finalLon, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
tileView.setFractionalZoom(zoom, 0, false);
|
||||||
|
|
||||||
|
if (rotation != startRotaton) {
|
||||||
|
AnimateDraggingMapThread.this.targetRotate = rotation;
|
||||||
|
}
|
||||||
|
pendingRotateAnimation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void startMoving(final double finalLat, final double finalLon, final int endZoom, final boolean notifyListener){
|
public void startMoving(final double finalLat, final double finalLon, final int endZoom, final boolean notifyListener){
|
||||||
stopAnimatingSync();
|
stopAnimatingSync();
|
||||||
|
|
Loading…
Reference in a new issue