From 829e45224fa04d2fb4c8012afc67da51a3f5f3bd Mon Sep 17 00:00:00 2001 From: Emux Date: Mon, 21 Nov 2016 12:42:48 +0200 Subject: [PATCH] Animator easing: improvements and backwards API compatibility (#242) #246 --- docs/Changelog.md | 1 + .../android/test/BitmapTileMapActivity.java | 5 ++-- .../oscim/android/test/SimpleMapActivity.java | 5 ++-- vtm-gdx/src/org/oscim/gdx/InputHandler.java | 4 +-- vtm/src/org/oscim/layers/MapEventLayer.java | 3 +-- vtm/src/org/oscim/map/Animator.java | 27 ++++++++++++++++--- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/docs/Changelog.md b/docs/Changelog.md index 3cd4a47a..1ecfbf2a 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -10,6 +10,7 @@ - House numbers (nodes) fix visibility [#168](https://github.com/mapsforge/vtm/issues/168) - Use baseline 160dpi in scaling [#236](https://github.com/mapsforge/vtm/issues/236) - MapFileTileSource zoom level API enhancements [#219](https://github.com/mapsforge/vtm/issues/219) +- Animator enhancements with easing functions [#246](https://github.com/mapsforge/vtm/issues/246) - Tile grid layer scaling [#238](https://github.com/mapsforge/vtm/issues/238) - Internal render themes various improvements [#41](https://github.com/mapsforge/vtm/issues/41) - Many other minor improvements and bug fixes diff --git a/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java b/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java index 420fec94..02587576 100644 --- a/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/BitmapTileMapActivity.java @@ -25,7 +25,6 @@ import org.oscim.layers.tile.bitmap.BitmapTileLayer; import org.oscim.renderer.MapRenderer; import org.oscim.tiling.source.bitmap.BitmapTileSource; import org.oscim.tiling.source.bitmap.DefaultSources; -import org.oscim.utils.Easing; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,7 +94,7 @@ public class BitmapTileMapActivity extends MapActivity { if (i == 1) { mMapView.map().getMapPosition(p); p.setScale(4); - mMapView.map().animator().animateTo(time, p, Easing.Type.LINEAR); + mMapView.map().animator().animateTo(time, p); } else { //mMapView.map().setMapPosition(p); p.setScale(2 + (1 << (int) (Math.random() * 13))); @@ -108,7 +107,7 @@ public class BitmapTileMapActivity extends MapActivity { p.setBearing((float) (Math.random() * 360)); //mMapView.map().setMapPosition(p); - mMapView.map().animator().animateTo(time, p, Easing.Type.LINEAR); + mMapView.map().animator().animateTo(time, p); } loooop((i + 1) % 2); diff --git a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java index 4921b70c..df74f6b3 100644 --- a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java @@ -34,7 +34,6 @@ import org.oscim.scalebar.MetricUnitAdapter; import org.oscim.theme.IRenderTheme; import org.oscim.theme.ThemeLoader; import org.oscim.theme.VtmThemes; -import org.oscim.utils.Easing; public class SimpleMapActivity extends BaseMapActivity { private DefaultMapScaleBar mapScaleBar; @@ -92,7 +91,7 @@ public class SimpleMapActivity extends BaseMapActivity { if (i == 1) { mMapView.map().getMapPosition(p); p.setScale(4); - mMapView.map().animator().animateTo(time, p, Easing.Type.LINEAR); + mMapView.map().animator().animateTo(time, p); } else { //mMapView.map().setMapPosition(p); @@ -106,7 +105,7 @@ public class SimpleMapActivity extends BaseMapActivity { p.setBearing((float) (Math.random() * 360)); //mMapView.map().setMapPosition(p); - mMapView.map().animator().animateTo(time, p, Easing.Type.LINEAR); + mMapView.map().animator().animateTo(time, p); } loooop((i + 1) % 2); diff --git a/vtm-gdx/src/org/oscim/gdx/InputHandler.java b/vtm-gdx/src/org/oscim/gdx/InputHandler.java index 12c15ab4..961a2ab9 100644 --- a/vtm-gdx/src/org/oscim/gdx/InputHandler.java +++ b/vtm-gdx/src/org/oscim/gdx/InputHandler.java @@ -96,11 +96,11 @@ public class InputHandler implements InputProcessor { mMap.updateMap(true); break; case Input.Keys.NUM_1: - mMap.animator().animateZoom(500, 0.5, 0, 0, Easing.Type.LINEAR); + mMap.animator().animateZoom(500, 0.5, 0, 0); mMap.updateMap(false); break; case Input.Keys.NUM_2: - mMap.animator().animateZoom(500, 2, 0, 0, Easing.Type.LINEAR); + mMap.animator().animateZoom(500, 2, 0, 0); mMap.updateMap(false); break; diff --git a/vtm/src/org/oscim/layers/MapEventLayer.java b/vtm/src/org/oscim/layers/MapEventLayer.java index 4096c14b..a0a06ba0 100644 --- a/vtm/src/org/oscim/layers/MapEventLayer.java +++ b/vtm/src/org/oscim/layers/MapEventLayer.java @@ -27,7 +27,6 @@ import org.oscim.event.MotionEvent; import org.oscim.map.Map; import org.oscim.map.Map.InputListener; import org.oscim.map.ViewController; -import org.oscim.utils.Easing; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,7 +177,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen } /* handle double tap zoom */ - mMap.animator().animateZoom(300, 2, pivotX, pivotY, Easing.Type.LINEAR); + mMap.animator().animateZoom(300, 2, pivotX, pivotY); } else if (mStartMove > 0) { /* handle fling gesture */ diff --git a/vtm/src/org/oscim/map/Animator.java b/vtm/src/org/oscim/map/Animator.java index 32641700..b97fd276 100644 --- a/vtm/src/org/oscim/map/Animator.java +++ b/vtm/src/org/oscim/map/Animator.java @@ -66,6 +66,10 @@ public class Animator { mMap = map; } + public synchronized void animateTo(long duration, BoundingBox bbox) { + animateTo(duration, bbox, Easing.Type.LINEAR); + } + public synchronized void animateTo(long duration, BoundingBox bbox, Easing.Type easingType) { ThreadUtils.assertMainThread(); @@ -100,6 +104,14 @@ public class Animator { animateTo(1000, bbox, Easing.Type.LINEAR); } + /** + * Animate to GeoPoint + * + * @param duration in ms + * @param geoPoint + * @param scale + * @param relative alter scale relative to current scale + */ public void animateTo(long duration, GeoPoint geoPoint, double scale, boolean relative) { animateTo(duration, geoPoint, scale, relative, Easing.Type.LINEAR); @@ -108,10 +120,11 @@ public class Animator { /** * Animate to GeoPoint * - * @param duration in ms + * @param duration in ms * @param geoPoint * @param scale - * @param relative alter scale relative to current scale + * @param relative alter scale relative to current scale + * @param easingType easing function */ public void animateTo(long duration, GeoPoint geoPoint, double scale, boolean relative, Easing.Type easingType) { @@ -136,6 +149,10 @@ public class Animator { animateTo(500, p, 1, true, Easing.Type.LINEAR); } + public void animateTo(long duration, MapPosition pos) { + animateTo(duration, pos, Easing.Type.LINEAR); + } + public void animateTo(long duration, MapPosition pos, Easing.Type easingType) { ThreadUtils.assertMainThread(); @@ -238,7 +255,11 @@ public class Animator { } float adv = clamp(1.0f - millisLeft / mDuration, 0, 1); - adv = Easing.ease(0, (long) (adv * Long.MAX_VALUE), Long.MAX_VALUE, mEasingType); + // Avoid redundant calculations in case of linear easing + if (mEasingType != Easing.Type.LINEAR) { + adv = Easing.ease(0, (long) (adv * Long.MAX_VALUE), Long.MAX_VALUE, mEasingType); + adv = clamp(adv, 0, 1); + } double scaleAdv = 1; if ((mState & ANIM_SCALE) != 0) {