diff --git a/OsmAnd-java/src/test/resources/search/double_parking.json b/OsmAnd-java/src/test/resources/search/double_parking.json index 0c23cebe3d..46abccb8d1 100644 --- a/OsmAnd-java/src/test/resources/search/double_parking.json +++ b/OsmAnd-java/src/test/resources/search/double_parking.json @@ -17,6 +17,7 @@ "Parking fee: no (Charging station / Transportation)", "Parking fee: yes (Charging station / Transportation)", "Parking lot (Fire hydrant / Emergency infrastructure)", + "Parking space (Personal transport)", "Parking tickets (Vending machine / Store)", "Parking tickets (Vending machine / Store)", "Parking time limit (Parking / Personal transport)", diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 1ec73bd270..5dd440270c 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -763,7 +763,7 @@ Slowakisches Wiki Polnisches Wiki Niederländisches Wiki - Neu-Norwegisches Wiki + Neu-norwegisches Wiki Norwegisches Wiki Kroatisches Wiki Haitianisches Wiki @@ -773,7 +773,7 @@ Arabisches Wiki Weißrussisches Wiki Bulgarisches Wiki - Cebuanosprachiges Wiki + Cebuano-Wiki Tschechisches Wiki Dänisches Wiki Deutsches Wiki @@ -864,7 +864,7 @@ Nationaler Wanderweg Regionaler Wanderweg Örtlicher Wanderweg - Wanderwegshinweis + Wanderweghinweis Leerungszeiten Betriebszeiten Verlassenes Objekt @@ -933,7 +933,7 @@ Dusche E-Mail Fax - "Facebook " + Facebook Handy nein ja @@ -944,7 +944,7 @@ Zutritt verboten Kundenverkehr frei Lieferverkehr frei - Landwirtschaftl. Verkehr frei + Landwirtschaftlicher Verkehr frei Recyclingzentrum Aluminium Weiße Ware @@ -1030,7 +1030,7 @@ Anfangsdatum ja nein - Eingeschränkt + eingeschränkt Großhandel Inhalt: Silage Inhalt: Wasser @@ -1133,7 +1133,7 @@ Maximalbreite IATA-Code ICAO-Code - FAA Code + FAA-Code Breite Architekt Architektur: Modern @@ -1174,7 +1174,7 @@ Tanz Militär Kinder - Frauen + Damen Sport Männer Orthopädisch @@ -1329,7 +1329,7 @@ ja Nicht überdacht Nicht erlaubt - Nur Außerhalb + Nur außerhalb Erlaubt In einem separaten Raum ja @@ -1357,7 +1357,7 @@ Trittsteine Grüne Wiese Jainismus - schwarzes Brett + Schwarzes Brett Gartenstil: Englisch Gartenstil: Japanisch Kapazität @@ -1374,8 +1374,8 @@ Elternplätze Kabinen-, Gondel-, Sesselkapazität Kapazität pro Stunde - durchschnittliche Fahrzeit, Minuten - mit Überdachung + Durchschnittliche Fahrzeit, Minuten + Mit Überdachung Ohne Überdachung ja Keine Heizung @@ -1387,7 +1387,7 @@ Ein- und Ausgang Sommereingang Sommerausgang - Sommer Ein- und Ausgang + Sommerein- und -ausgang 1 (Tourist) 1S (gehobener Tourist) 2 (Standard) @@ -1397,7 +1397,7 @@ 4 (Erste Klasse) 4S (gehobene Erste Klasse) 5 (Luxus) - 5S (gehobenes De Luxe) + 5S (gehobener Luxus) Sterne: 6 Sterne: 7 Zimmer @@ -1467,7 +1467,7 @@ Pfingstler Kirche von England Episkopalkirche - Schia + Schiitisch Vereinigten Tibetisch Vereinigt Reformiert @@ -1504,11 +1504,11 @@ Stadt Nekropole Erdarbeiten - Megalith-Typ: Menhir - Megalith-Typ: Dolmen + Megalithtyp: Menhir + Megalithtyp: Dolmen Befestigungstyp: Wallburg Befestigungstyp: Limes - Festungsbautyp: Schanze + Befestungstyp: Schanze Befestigungstyp: Ringgraben Pa (befestigte Siedlung der Maori) Historischer Bauernhof @@ -1603,8 +1603,8 @@ Unitarisch Wesleyaner Shingon-shū - Mahayana Buddhisten - Jersey Barriere + Mahayana-Buddhisten + Jersey-Barriere Nadelwald Küche Wegweiser @@ -1620,7 +1620,7 @@ Lkw-Maut ja Ohne Blindenleitsystem - Nur wenn Gehen erlaubt ist + Nur, wenn Gehen erlaubt ist Raststätte Bahnübergang Reiten @@ -1669,7 +1669,7 @@ Routex-Tankkarten nicht akzeptiert Bancomat Bancomat nicht akzeptiert - vorausbezahlte Fahrkarten + Vorausbezahlte Fahrkarten JCB JCB-Karten nicht akzeptiert Eurowag @@ -1693,9 +1693,9 @@ E‑ZPass nicht akzeptiert KITCard KITCard nicht akzeptiert - V PAY + V-Pay V-Pay-Karten nicht akzeptiert - Dogecoin Ɖ + Dogecoin Dogecoin nicht akzeptiert Cibus Cibus-Karten nicht akzeptiert @@ -1705,7 +1705,7 @@ Geldkarte nicht akzeptiert Proton Proton-Karten nicht akzeptiert - Avant Karte + Avantcard Avantcard nicht akzeptiert MEP MEP nicht akzeptiert @@ -1719,7 +1719,7 @@ Monedero 4B nicht akzeptiert Monedero Monedero nicht akzeptiert - BankAxes + BankAxess BankAxess nicht akzeptiert Coinkite Coinkite nicht akzeptiert @@ -1727,8 +1727,8 @@ Roadrunner-Karten nicht akzeptiert SVG SVG nicht akzeptiert - SMS Zahlungen - SMS-Zahlung nicht akzeptiert + SMS-Zahlungen + SMS-Zahlungen nicht akzeptiert OV-Chipkaart OV-Chipkaart nicht akzeptiert Oyster @@ -1751,7 +1751,7 @@ Golden Crown-Karten nicht akzeptiert PRO100 PRO100-Karten nicht akzeptiert - Union Karte + Union-Karte Union-Karte nicht akzeptiert MTS-Money MTS-Money nicht akzeptiert @@ -1762,19 +1762,19 @@ Internetzugang: kostenlos Veranstaltungsort Nur vegetarisch - Vegetarische + Vegetarisch Vegetarisch: nein - vegetarisch (wenige) + Vegetarisch (wenige) Nur vegan Vegan Vegan: nein - Nur glutenfreie - glutenfrei + Nur glutenfrei + Glutenfrei Glutenfrei: nein Nur koscher Koscher Koscher: nein - Nur Halal + Nur halal Halal Halal: nein Nur laktosefrei @@ -1799,7 +1799,7 @@ Rundumservice Flugzeugtankstelle Öffentliches Bad - im Freien + Im Freien Innen Rollstuhlgerechte Toilette: ja Rollstuhlgerechte Toilette: nein @@ -1817,7 +1817,7 @@ Fahrscheine Getränke Süßigkeiten - Paketausgabe und -annahmestelle + Paketausgabe- und -annahmestelle Kondome Briefmarken Essen @@ -1850,7 +1850,7 @@ Stele Büste Koshinto - blaue Plakette + Blaue Plakette Jizo Kreuzförmig Fahrzeug @@ -1905,8 +1905,8 @@ Felsüberhang Sonnenschutz Feldhütte - Unterstand-Typ: Zelt - Unterstand-Typ: verlassen + Unterstandtyp: Zelt + Unterstandtyp: verlassen Tempelturm Baryt Strangmoor @@ -1924,7 +1924,7 @@ Kunstart: Stele Kunstart: Brunnen Architektur: Stalinistischer Neoklassizismus - Architektur: Eklektisch + Architektur: eklektisch Architektur: Neue Sachlichkeit Architektur: Zeitgenössisch Architektur: Konstruktivismus @@ -1932,7 +1932,7 @@ Architektur: Holzrahmen Architektur: Jugendstil Architektur: Neoklassizismus - Architektur: Viktorianisch + Architektur: viktorianisch Architektur: Brutalismus Architektur: Klassizismus Architektur: Gotik @@ -1943,12 +1943,12 @@ Architektur: Romanik Wassertunnel Wasserbrücke - Brückenkonstruktion: Strahl + Brückenkonstruktion: Balken Brückenkonstruktion: einfache Aufhängung Brückenkonstruktion: Aufhängung Brückenkonstruktion: Bogen Brückenkonstruktion: Fachwerk - Brückenkonstruktion: Schwimmend + Brückenkonstruktion: schwimmend Brückenkonstruktion: Buckel Brückenkonstruktion: Schrägseil Brückenkonstruktion: Promenade @@ -1966,7 +1966,7 @@ Beweglicher Brückentyp: Schubbrücke Beleuchtung: ja Beleuchtung: nein - Oberfläche: unbefestigte + Oberfläche: unbefestigt Oberfläche: befestigt Oberfläche: Asphalt Oberfläche: Beton @@ -1990,7 +1990,7 @@ Oberfläche: Salz Oberfläche: Schnee Bus - geteiltes Taxi + Geteiltes Taxi Oberleitungsbus Straßenbahn Zug @@ -2012,7 +2012,7 @@ Fahrradpumpe: nein Fahrradwerkzeuge für Eigenreparatur: nein Werkzeuge für Eigenreparatur - Reinigung + Fahrradreinigung Fahrradreinigung: nein Fahrradkettenwerkzeug Fahrradkettenwerkzeug: nein @@ -2055,7 +2055,7 @@ Beförderungstyp: Pferd Honiggeschäft Technisches Denkmal - Camping-Büro + Campingbüro Modellflugplatz Fremdenführerbüro Mittlerorganisation @@ -2105,7 +2105,7 @@ Burgtyp: Palast Burgtyp: Verteidigung, stattlich Thailändisch - Sexuelle + Sexuell Massagen Therapeutisch Sauna @@ -2237,9 +2237,9 @@ Typ: Steinkreuz Hüttenkreis Petroglyphe - Megalith-Typ: Nuraghe - Megalith-Typ: Steinkreis - Megalith-Typ: Ganggrab + Megalithtyp: Nuraghe + Megalithtyp: Steinkreis + Megalithtyp: Ganggrab Gipfelkreuz: ja Vermittlung: ja Afrikanisches Wiki @@ -2248,7 +2248,7 @@ Bishnupriyaisches Wiki Bretonisches Wiki Walisisches Wiki - Esperantoisches Wiki + Esperanto-Wiki Baskisches Wiki Farsisches Wiki Malayalamisches Wiki @@ -2257,7 +2257,7 @@ Warayisches Wiki Minangkabauisches Wiki Minnanisches Wiki - Malagasisches Wiki + Madagassisches Wiki Tatarisches Wiki Kirgisisches Wiki Tadschikisches Wiki @@ -2270,7 +2270,7 @@ Aragonesisches Wiki Gujaratisches Wiki Palsamoor - IC gespeicherte Fährfahrkarten + IC-gespeicherte Fährfahrkarten IC-gespeicherte Fährfahrkarten nicht akzeptiert Allgemeinmediziner Augenheilkunde @@ -2460,7 +2460,7 @@ Paragleiten: nein Drachenfliegen Drachenfliegen: nein - Strikt + Freeflying starr Freeflying starr: nein Freeflying Ausrichtung: N Freeflying-Platzausrichtung: NO diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 83dd6438de..009775bea2 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -1802,7 +1802,7 @@ Lon %2$s Übersichtsseite oder Menüsteuerung Es besteht die Möglichkeit, die App primär über die flexible Übersichtsseite oder ein statisches Menü zu steuern. Ihre Wahl kann jederzeit in den Übersichtsseiten-Einstellungen geändert werden. Aufruf von der Karte aus - Neu erstellen + Neue Katagorie erstellen Weiter %.1f MB Bitte einen gültigen POI-Typ angeben oder überspringen. @@ -3426,4 +3426,5 @@ Lon %2$s Alle Profil-Einstellungen werden auf den Ausgangszustand nach App-Installation zurückgesetzt. Alle Profil-Einstellungen auf den Standard zurücksetzen\? %1$s: %2$s + %1$s %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 3d0b111958..cfd3ced71e 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3412,4 +3412,5 @@ כל הגדרות הפרופיל יאופסו למצב כמו שלאחר ההתקנה. לאפס את הגדרות הפרופיל לבררת המחדל\? %1$s:‏ %2$s + %1$s %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index ed12d660ac..c431149358 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3642,4 +3642,7 @@ Бушеншанк (изысканные австрийские вина) Изысканная кухня Сеть + Парковочное место + + \ No newline at end of file diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index 2c21a5fdb4..349b9b43a4 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -4157,4 +4157,8 @@ Grave + Parking space + + URL + diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index cec5ba509a..c61b95ba30 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -2290,6 +2290,7 @@ public class OsmandSettings { public static final String LAST_KNOWN_MAP_LAT = "last_known_map_lat"; //$NON-NLS-1$ public static final String LAST_KNOWN_MAP_LON = "last_known_map_lon"; //$NON-NLS-1$ public static final String LAST_KNOWN_MAP_ZOOM = "last_known_map_zoom"; //$NON-NLS-1$ + public static final String LAST_KNOWN_MAP_ELEVATION = "last_known_map_elevation"; //$NON-NLS-1$ public static final String MAP_LABEL_TO_SHOW = "map_label_to_show"; //$NON-NLS-1$ public static final String MAP_LAT_TO_SHOW = "map_lat_to_show"; //$NON-NLS-1$ @@ -2403,6 +2404,14 @@ public class OsmandSettings { settingsAPI.edit(globalPreferences).putInt(LAST_KNOWN_MAP_ZOOM, zoom).commit(); } + public float getLastKnownMapElevation() { + return settingsAPI.getFloat(globalPreferences, LAST_KNOWN_MAP_ELEVATION, 90); + } + + public void setLastKnownMapElevation(float elevation) { + settingsAPI.edit(globalPreferences).putFloat(LAST_KNOWN_MAP_ELEVATION, elevation).commit(); + } + public final static String POINT_NAVIGATE_LAT = "point_navigate_lat"; //$NON-NLS-1$ public final static String POINT_NAVIGATE_LON = "point_navigate_lon"; //$NON-NLS-1$ public final static String POINT_NAVIGATE_ROUTE = "point_navigate_route_integer"; //$NON-NLS-1$ diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 7cc31b8bba..6449751c41 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -474,7 +474,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven OsmAndMapLayersView ml = (OsmAndMapLayersView) findViewById(R.id.MapLayersView); ml.setVisibility(View.VISIBLE); atlasMapRendererView.setAzimuth(0); - atlasMapRendererView.setElevationAngle(90); + atlasMapRendererView.setElevationAngle(app.getSettings().getLastKnownMapElevation()); NativeCoreContext.getMapRendererContext().setMapRendererView(atlasMapRendererView); ml.setMapView(mapView); mapViewTrackingUtilities.setMapView(mapView); @@ -488,6 +488,12 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } } + public void setMapElevation(float angle) { + if (atlasMapRendererView != null) { + atlasMapRendererView.setElevationAngle(angle); + } + } + private void createProgressBarForRouting() { final ProgressBar pb = (ProgressBar) findViewById(R.id.map_horizontal_progress); @@ -1490,6 +1496,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } settings.setLastKnownMapZoom(mapView.getZoom()); + settings.setLastKnownMapElevation(mapView.getElevationAngle()); settings.MAP_ACTIVITY_ENABLED.set(false); app.getResourceManager().interruptRendering(); OsmandPlugin.onMapActivityPause(this); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java index a411d5a128..94b4dfb0df 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java @@ -319,8 +319,8 @@ public class AddPointBottomSheetDialog extends MenuBottomSheetDialogFragment { final View switchStartAndEndView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.bottom_sheet_item_simple_56dp, null); TextView title = (TextView) switchStartAndEndView.findViewById(R.id.title); - String start = getString(R.string.route_start_point).toLowerCase(); - String destination = getString(R.string.route_descr_destination).toLowerCase(); + String start = getString(R.string.route_start_point); + String destination = getString(R.string.route_descr_destination); String titleS = getString(R.string.swap_two_places, start, destination); SpannableString titleSpan = new SpannableString(titleS); int startIndex = titleS.indexOf(start); diff --git a/OsmAnd/src/net/osmand/plus/views/MultiTouchSupport.java b/OsmAnd/src/net/osmand/plus/views/MultiTouchSupport.java index 166d3f04ee..1e264e6d5d 100644 --- a/OsmAnd/src/net/osmand/plus/views/MultiTouchSupport.java +++ b/OsmAnd/src/net/osmand/plus/views/MultiTouchSupport.java @@ -5,6 +5,8 @@ import android.graphics.PointF; import android.view.MotionEvent; import net.osmand.PlatformUtil; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.views.corenative.NativeCoreContext; import net.osmand.util.MapUtils; import org.apache.commons.logging.Log; @@ -36,6 +38,10 @@ public class MultiTouchSupport { public void onActionPointerUp(); public void onActionCancel(); + + public void onChangingViewAngle(float angle); + + public void onChangeViewAngleStarted(); } private boolean multiTouchAPISupported = false; @@ -62,6 +68,14 @@ public class MultiTouchSupport { return inZoomMode; } + public boolean isInTiltMode() { + return inTiltMode; + } + + private boolean isTiltSupported() { + return ((OsmandApplication) ctx.getApplicationContext()).getSettings().USE_OPENGL_RENDER.get() && NativeCoreContext.isInit(); + } + private void initMethods(){ try { getPointerCount = MotionEvent.class.getMethod("getPointerCount"); //$NON-NLS-1$ @@ -76,9 +90,15 @@ public class MultiTouchSupport { } private boolean inZoomMode = false; + private boolean inTiltMode = false; private double zoomStartedDistance = 100; private double zoomRelative = 1; private PointF centerPoint = new PointF(); + private PointF firstFingerStart = new PointF(); + private PointF secondFingerStart = new PointF(); + private static final int TILT_X_THRESHOLD_PX = 40; + private static final int TILT_Y_THRESHOLD_PX = 40; + private static final int TILT_DY_THRESHOLD_PX = 40; public boolean onTouchEvent(MotionEvent event){ if(!isMultiTouchSupported()){ @@ -91,10 +111,13 @@ public class MultiTouchSupport { } Integer pointCount = (Integer) getPointerCount.invoke(event); if(pointCount < 2){ - if(inZoomMode){ + if (inZoomMode) { listener.onZoomOrRotationEnded(zoomRelative, angleRelative); inZoomMode = false; return true; + } else if (inTiltMode) { + inTiltMode = false; + return true; } return false; } @@ -114,27 +137,58 @@ public class MultiTouchSupport { } if (actionCode == ACTION_POINTER_DOWN) { centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2); + firstFingerStart = new PointF(x1, y1); + secondFingerStart = new PointF(x2, y2); listener.onGestureInit(x1, y1, x2, y2); listener.onZoomStarted(centerPoint); zoomStartedDistance = distance; angleStarted = angle; - inZoomMode = true; return true; } else if(actionCode == ACTION_POINTER_UP){ - if(inZoomMode){ + if (inZoomMode) { listener.onZoomOrRotationEnded(zoomRelative, angleRelative); inZoomMode = false; + } else if (inTiltMode) { + inTiltMode = false; } return true; - } else if(inZoomMode && actionCode == MotionEvent.ACTION_MOVE){ - // Keep zoom center fixed or flexible - centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2); + } else if (actionCode == MotionEvent.ACTION_MOVE) { + if (inZoomMode) { - if(angleDefined) { - angleRelative = MapUtils.unifyRotationTo360(angle - angleStarted); + // Keep zoom center fixed or flexible + centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2); + + if (angleDefined) { + angleRelative = MapUtils.unifyRotationTo360(angle - angleStarted); + } + zoomRelative = distance / zoomStartedDistance; + listener.onZoomingOrRotating(zoomRelative, angleRelative); + } else if (inTiltMode) { + float dy2 = secondFingerStart.y - y2; + float viewAngle = dy2 / 8f; + listener.onChangingViewAngle(viewAngle); + } else if (isTiltSupported()) { + float dx1 = Math.abs(firstFingerStart.x - x1); + float dx2 = Math.abs(secondFingerStart.x - x2); + float dy1 = Math.abs(firstFingerStart.y - y1); + float dy2 = Math.abs(secondFingerStart.y - y2); + float startDy = Math.abs(secondFingerStart.y - firstFingerStart.y); + if (dx1 < TILT_X_THRESHOLD_PX && dx2 < TILT_X_THRESHOLD_PX + && dy1 > TILT_Y_THRESHOLD_PX && dy2 > TILT_Y_THRESHOLD_PX + && startDy < TILT_Y_THRESHOLD_PX * 6 + && Math.abs(dy2 - dy1) < TILT_DY_THRESHOLD_PX) { + listener.onChangeViewAngleStarted(); + inTiltMode = true; + } else if (dx1 > TILT_X_THRESHOLD_PX || dx2 > TILT_X_THRESHOLD_PX + || Math.abs(dy2 - dy1) > TILT_DY_THRESHOLD_PX + || Math.abs(dy1 - dy2) > TILT_DY_THRESHOLD_PX) { + angleRelative = 0; + zoomRelative = 0; + inZoomMode = true; + } + } else { + inZoomMode = true; } - zoomRelative = distance / zoomStartedDistance; - listener.onZoomingOrRotating(zoomRelative, angleRelative); return true; } } catch (Exception e) { diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index eafefe7710..1f4f32c4c2 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -186,6 +186,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { private long multiTouchStartTime; private long multiTouchEndTime; private boolean wasZoomInMultiTouch; + private float elevationAngle; public OsmandMapTileView(MapActivity activity, int w, int h) { this.activity = activity; @@ -257,6 +258,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } } }; + elevationAngle = settings.getLastKnownMapElevation(); } public void setView(View view) { @@ -439,6 +441,10 @@ public class OsmandMapTileView implements IMapDownloaderCallback { return currentViewport.getZoom(); } + public float getElevationAngle() { + return elevationAngle; + } + public double getZoomFractionalPart() { return currentViewport.getZoomFloatPart(); } @@ -1127,6 +1133,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { private LatLon initialCenterLatLon; private boolean startRotating = false; private static final float ANGLE_THRESHOLD = 30; + private float initialElevation; @Override public void onZoomOrRotationEnded(double relativeToStart, float angleRelative) { @@ -1199,6 +1206,16 @@ public class OsmandMapTileView implements IMapDownloaderCallback { multiTouch = false; } + @Override + public void onChangingViewAngle(float angle) { + setElevationAngle(initialElevation - angle); + } + + @Override + public void onChangeViewAngleStarted() { + initialElevation = elevationAngle; + } + @Override public void onZoomStarted(PointF centerPoint) { initialMultiTouchCenterPoint = centerPoint; @@ -1287,6 +1304,16 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } + private void setElevationAngle(float angle) { + if (angle < 35f) { + angle = 35f; + } else if (angle > 90f) { + angle = 90f; + } + this.elevationAngle = angle; + ((MapActivity) activity).setMapElevation(angle); + } + private boolean isZoomingAllowed(int baseZoom, float dz) { if (baseZoom > getMaxZoom()) { return false; @@ -1346,7 +1373,9 @@ public class OsmandMapTileView implements IMapDownloaderCallback { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - dragToAnimate(e2.getX() + distanceX, e2.getY() + distanceY, e2.getX(), e2.getY(), true); + if (!multiTouchSupport.isInTiltMode()) { + dragToAnimate(e2.getX() + distanceX, e2.getY() + distanceY, e2.getX(), e2.getY(), true); + } return true; }