diff --git a/OsmAnd/src/net/osmand/plus/GPXUtilities.java b/OsmAnd/src/net/osmand/plus/GPXUtilities.java index a507da4eab..1d916a6e3a 100644 --- a/OsmAnd/src/net/osmand/plus/GPXUtilities.java +++ b/OsmAnd/src/net/osmand/plus/GPXUtilities.java @@ -301,6 +301,9 @@ public class GPXUtilities { public List elevationData; public List speedData; + public boolean hasElevationData; + public boolean hasSpeedData; + public boolean isSpeedSpecified() { return avgSpeed > 0; } @@ -472,9 +475,15 @@ public class GPXUtilities { elevation1.time = timeDiff; elevation1.distance = (j > 0) ? calculations[0] : 0; elevationData.add(elevation1); + if (!hasElevationData && !Float.isNaN(elevation1.elevation) && totalDistance > 0) { + hasElevationData = true; + } speed1.time = timeDiff; speed1.distance = elevation1.distance; speedData.add(speed1); + if (!hasSpeedData && speed1.speed > 0 && totalDistance > 0) { + hasSpeedData = true; + } } } if (!isTimeSpecified()) { diff --git a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java index 2fdc36c532..c33315f090 100644 --- a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java +++ b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java @@ -676,7 +676,7 @@ public class GpxSelectionHelper { public boolean route; public WptPt locationOnMap; - public GPXDataSetType chartType; + public GPXDataSetType[] chartTypes; public GPXDataSetAxisType chartAxisType = GPXDataSetAxisType.DISTANCE; public Matrix chartMatrix; diff --git a/OsmAnd/src/net/osmand/plus/activities/ShowRouteInfoDialogFragment.java b/OsmAnd/src/net/osmand/plus/activities/ShowRouteInfoDialogFragment.java index 10df4bb163..85ff90c5a3 100644 --- a/OsmAnd/src/net/osmand/plus/activities/ShowRouteInfoDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/ShowRouteInfoDialogFragment.java @@ -49,6 +49,7 @@ import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType; +import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu; import net.osmand.plus.routing.RouteDirectionInfo; @@ -75,6 +76,7 @@ public class ShowRouteInfoDialogFragment extends DialogFragment { private RouteInfoAdapter adapter; private GPXFile gpx; private OrderedLineDataSet elevationDataSet; + private OrderedLineDataSet slopeDataSet; private GpxDisplayItem gpxItem; private boolean hasHeights; @@ -241,20 +243,21 @@ public class ShowRouteInfoDialogFragment extends DialogFragment { }); GPXTrackAnalysis analysis = gpx.getAnalysis(0); - if (analysis.totalDistance > 0) { + if (analysis.hasElevationData) { List dataSets = new ArrayList<>(); - elevationDataSet = - GpxUiHelper.createGPXElevationDataSet(app, mChart, analysis, GPXDataSetAxisType.DISTANCE, false, true); + elevationDataSet = GpxUiHelper.createGPXElevationDataSet(app, mChart, analysis, + GPXDataSetAxisType.DISTANCE, false, true); dataSets.add(elevationDataSet); - if (analysis.elevationData.size() > 1) { - OrderedLineDataSet slopeDataSet = - GpxUiHelper.createGPXSlopeDataSet(app, mChart, analysis, GPXDataSetAxisType.DISTANCE, elevationDataSet.getValues(), true, true); - dataSets.add(slopeDataSet); - } + slopeDataSet = GpxUiHelper.createGPXSlopeDataSet(app, mChart, analysis, + GPXDataSetAxisType.DISTANCE, elevationDataSet.getValues(), true, true); + dataSets.add(slopeDataSet); + LineData data = new LineData(dataSets); mChart.setData(data); mChart.setVisibility(View.VISIBLE); } else { + elevationDataSet = null; + slopeDataSet = null; mChart.setVisibility(View.GONE); } ((TextView) headerView.findViewById(R.id.average_text)) @@ -291,7 +294,7 @@ public class ShowRouteInfoDialogFragment extends DialogFragment { if (gpxItem != null) { LatLon location = null; WptPt wpt = null; - gpxItem.chartType = GpxUiHelper.GPXDataSetType.ALTITUDE; + gpxItem.chartTypes = new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE }; if (gpxItem.chartHighlightPos != -1) { TrkSegment segment = gpx.tracks.get(0).segments.get(0); if (segment != null) { diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index 5e5582a49a..dea7566821 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -12,6 +12,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; +import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; @@ -865,6 +866,7 @@ public class GpxUiHelper { mChart.getDescription().setEnabled(false); mChart.setMaxVisibleValueCount(10); mChart.setMinOffset(0f); + mChart.setDragDecelerationEnabled(false); mChart.setExtraTopOffset(24f); mChart.setExtraBottomOffset(16f); @@ -1443,7 +1445,7 @@ public class GpxUiHelper { this.imageId = imageId; } - public String getName(Context ctx) { + public String getName(@NonNull Context ctx) { return ctx.getString(stringId); } @@ -1455,9 +1457,33 @@ public class GpxUiHelper { return imageId; } - public Drawable getImageDrawable(OsmandApplication app) { + public Drawable getImageDrawable(@NonNull OsmandApplication app) { return app.getIconsCache().getThemedIcon(imageId); } + + public static String getName(@NonNull Context ctx, @NonNull GPXDataSetType[] types) { + List list = new ArrayList<>(); + for (GPXDataSetType type : types) { + list.add(type.getName(ctx)); + } + Collections.sort(list); + StringBuilder sb = new StringBuilder(); + for (String s : list) { + if (sb.length() > 0) { + sb.append("/"); + } + sb.append(s); + } + return sb.toString(); + } + + public static Drawable getImageDrawable(@NonNull OsmandApplication app, @NonNull GPXDataSetType[] types) { + if (types.length > 0) { + return types[0].getImageDrawable(app); + } else { + return null; + } + } } public enum GPXDataSetAxisType { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenu.java index 825caa2c4c..7c968a3400 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenu.java @@ -639,7 +639,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener { } } mapActivity.getMapView().fitLocationToMap(latitude, longitude, mapActivity.getMapView().getZoom(), - tileBoxWidthPx, tileBoxHeightPx, AndroidUtils.dpToPx(mapActivity, 40f)); + tileBoxWidthPx, tileBoxHeightPx, AndroidUtils.dpToPx(mapActivity, 40f), true); } @Override diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 3b6d799445..8b43732d01 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -15,6 +15,7 @@ import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.github.mikephil.charting.listener.ChartTouchListener; +import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; import com.github.mikephil.charting.listener.OnChartGestureListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; @@ -41,6 +42,8 @@ import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControll import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; public class TrackDetailsMenu { @@ -239,7 +242,7 @@ public class TrackDetailsMenu { return new QuadRect(left, top, right, bottom); } - private void fitTrackOnMap(LineChart chart) { + private void fitTrackOnMap(LineChart chart, LatLon location, boolean forceFit) { QuadRect rect = getRect(chart, chart.getLowestVisibleX(), chart.getHighestVisibleX()); if (rect != null) { RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); @@ -256,30 +259,41 @@ public class TrackDetailsMenu { tileBoxHeightPx = tb.getPixHeight() - f.getHeight(); } } - mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, - tileBoxWidthPx, tileBoxHeightPx, 0); + if (forceFit) { + mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, + tileBoxWidthPx, tileBoxHeightPx, 0); + } else if (location != null && + !mapActivity.getMapView().getTileBox(tileBoxWidthPx, tileBoxHeightPx, 0).containsLatLon(location)) { + boolean animating = mapActivity.getMapView().getAnimatedDraggingThread().isAnimating(); + mapActivity.getMapView().fitLocationToMap(location.getLatitude(), location.getLongitude(), + mapActivity.getMapView().getZoom(), tileBoxWidthPx, tileBoxHeightPx, 0, !animating); + } else { + mapActivity.refreshMap(); + } + } } - private void refreshChart(LineChart chart) { + private void refreshChart(LineChart chart, boolean forceFit) { gpxItem.chartMatrix = new Matrix(chart.getViewPortHandler().getMatrixTouch()); Highlight[] highlights = chart.getHighlighted(); + LatLon location = null; if (highlights != null && highlights.length > 0) { gpxItem.chartHighlightPos = highlights[0].getX(); WptPt wpt = getPoint(chart, gpxItem.chartHighlightPos); if (wpt != null) { + location = new LatLon(wpt.lat, wpt.lon); if (gpxItem.route) { - mapActivity.getMapLayers().getMapInfoLayer().setSelectedPointLatLon(new LatLon(wpt.lat, wpt.lon)); + mapActivity.getMapLayers().getMapInfoLayer().setSelectedPointLatLon(location); } else { - mapActivity.getMapLayers().getGpxLayer().setSelectedPointLatLon(new LatLon(wpt.lat, wpt.lon)); + mapActivity.getMapLayers().getGpxLayer().setSelectedPointLatLon(location); } - //mapActivity.setMapLocation(wpt.lat, wpt.lon); } } else { gpxItem.chartHighlightPos = -1; } - fitTrackOnMap(chart); + fitTrackOnMap(chart, location, forceFit); } private void updateView(final View parentView) { @@ -287,7 +301,7 @@ public class TrackDetailsMenu { chart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() { @Override public void onValueSelected(Entry e, Highlight h) { - refreshChart(chart); + refreshChart(chart, false); } @Override @@ -296,13 +310,24 @@ public class TrackDetailsMenu { } }); chart.setOnChartGestureListener(new OnChartGestureListener() { + boolean hasTranslated = false; + @Override - public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { + public void onChartGestureStart(MotionEvent me, ChartGesture lastPerformedGesture) { + hasTranslated = false; } @Override - public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { - refreshChart(chart); + public void onChartGestureEnd(MotionEvent me, ChartGesture lastPerformedGesture) { + if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || + lastPerformedGesture == ChartGesture.X_ZOOM || + lastPerformedGesture == ChartGesture.Y_ZOOM || + lastPerformedGesture == ChartGesture.PINCH_ZOOM || + lastPerformedGesture == ChartGesture.DOUBLE_TAP || + lastPerformedGesture == ChartGesture.ROTATE) { + + refreshChart(chart, true); + } } @Override @@ -327,6 +352,7 @@ public class TrackDetailsMenu { @Override public void onChartTranslate(MotionEvent me, float dX, float dY) { + hasTranslated = true; } }); @@ -336,27 +362,37 @@ public class TrackDetailsMenu { if (analysis != null) { GpxUiHelper.setupGPXChart(app, chart, 4); - if (gpxItem.chartType != null) { + if (gpxItem.chartTypes != null) { List dataSets = new ArrayList<>(); - OrderedLineDataSet dataSet = null; - if (gpxItem.chartType != null) { - switch (gpxItem.chartType) { - case ALTITUDE: - dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, - gpxItem.chartAxisType, false, true); - break; - case SPEED: - dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, - gpxItem.chartAxisType, false, true); - break; - case SLOPE: - dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, - gpxItem.chartAxisType, null, false, true); - break; + if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) { + for (int i = 0; i < gpxItem.chartTypes.length; i++) { + OrderedLineDataSet dataSet = null; + switch (gpxItem.chartTypes[i]) { + case ALTITUDE: + dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, + gpxItem.chartAxisType, false, true); + break; + case SPEED: + dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, + gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true); + break; + case SLOPE: + dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, + gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true); + break; + } + dataSets.add(dataSet); } } - dataSets.add(dataSet); + Collections.sort(dataSets, new Comparator() { + @Override + public int compare(ILineDataSet ds1, ILineDataSet ds2) { + OrderedLineDataSet dataSet1 = (OrderedLineDataSet) ds1; + OrderedLineDataSet dataSet2 = (OrderedLineDataSet) ds2; + return dataSet1.getPriority() > dataSet2.getPriority() ? -1 : (dataSet1.getPriority() == dataSet2.getPriority() ? 0 : 1); + } + }); chart.setData(new LineData(dataSets)); updateChart(chart); } @@ -366,31 +402,38 @@ public class TrackDetailsMenu { ImageView yAxisIcon = (ImageView) parentView.findViewById(R.id.y_axis_icon); TextView yAxisTitle = (TextView) parentView.findViewById(R.id.y_axis_title); View yAxisArrow = parentView.findViewById(R.id.y_axis_arrow); - final List availableTypes = new ArrayList<>(); + final List availableTypes = new ArrayList<>(); if (analysis != null) { - if (analysis.elevationData != null) { - availableTypes.add(GPXDataSetType.ALTITUDE); - availableTypes.add(GPXDataSetType.SLOPE); + if (analysis.hasElevationData) { + availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE }); + availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SLOPE }); } - if (analysis.isSpeedSpecified()) { - availableTypes.add(GPXDataSetType.SPEED); + if (analysis.hasSpeedData) { + availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SPEED }); + } + if (analysis.hasElevationData) { + availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE }); + } + if (analysis.hasElevationData && analysis.hasSpeedData) { + availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED }); } } - availableTypes.remove(gpxItem.chartType); - yAxisIcon.setImageDrawable(gpxItem.chartType.getImageDrawable(app)); - yAxisTitle.setText(gpxItem.chartType.getName(app)); + yAxisIcon.setImageDrawable(GPXDataSetType.getImageDrawable(app, gpxItem.chartTypes)); + yAxisTitle.setText(GPXDataSetType.getName(app, gpxItem.chartTypes)); if (availableTypes.size() > 0) { yAxis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final PopupMenu optionsMenu = new PopupMenu(mapActivity, v); DirectionsDialogs.setupPopUpMenuIcon(optionsMenu); - for (final GPXDataSetType type : availableTypes) { - MenuItem menuItem = optionsMenu.getMenu().add(type.getStringId()).setIcon(type.getImageDrawable(app)); + for (final GPXDataSetType[] types : availableTypes) { + MenuItem menuItem = optionsMenu.getMenu() + .add(GPXDataSetType.getName(app, types)) + .setIcon(GPXDataSetType.getImageDrawable(app, types)); menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem mItem) { - gpxItem.chartType = type; + gpxItem.chartTypes = types; update(); return true; } @@ -451,7 +494,7 @@ public class TrackDetailsMenu { xAxisArrow.setVisibility(View.GONE); } - refreshChart(chart); + refreshChart(chart, true); } private void updateChart(LineChart chart) { @@ -480,7 +523,6 @@ public class TrackDetailsMenu { @Override public void updateToolbar(MapInfoWidgetsFactory.TopToolbarView view) { super.updateToolbar(view); - //view.getCloseButton().setVisibility(View.GONE); view.getShadowView().setVisibility(View.GONE); } } diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java index 9a78d948a1..413f133196 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java @@ -640,11 +640,11 @@ public class TrackSegmentFragment extends OsmAndListFragment { case GPX_TAB_ITEM_GENERAL: { OrderedLineDataSet speedDataSet = null; OrderedLineDataSet elevationDataSet = null; - if (analysis.isSpeedSpecified()) { + if (analysis.hasSpeedData) { speedDataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, GPXDataSetAxisType.DISTANCE, true, true); } - if (analysis.elevationData != null) { + if (analysis.hasElevationData) { elevationDataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, GPXDataSetAxisType.DISTANCE, false, true); } @@ -664,7 +664,7 @@ public class TrackSegmentFragment extends OsmAndListFragment { OrderedLineDataSet elevationDataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, GPXDataSetAxisType.DISTANCE, false, true); dataSets.add(elevationDataSet); - if (analysis.elevationData.size() > 1) { + if (analysis.hasElevationData) { OrderedLineDataSet slopeDataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, GPXDataSetAxisType.DISTANCE, elevationDataSet.getValues(), true, true); dataSets.add(slopeDataSet); @@ -775,8 +775,7 @@ public class TrackSegmentFragment extends OsmAndListFragment { switch (tabType) { case GPX_TAB_ITEM_GENERAL: if (analysis != null) { - if ((analysis.elevationData != null && analysis.totalDistance > 0) - || analysis.isSpeedSpecified()) { + if (analysis.hasElevationData || analysis.hasSpeedData) { GpxUiHelper.setupGPXChart(app, chart, 4); chart.setData(new LineData(getDataSets(GPXTabItemType.GPX_TAB_ITEM_GENERAL, chart))); updateChart(chart); @@ -829,7 +828,7 @@ public class TrackSegmentFragment extends OsmAndListFragment { break; case GPX_TAB_ITEM_ALTITUDE: if (analysis != null) { - if (analysis.elevationData != null && analysis.totalDistance > 0) { + if (analysis.hasElevationData) { GpxUiHelper.setupGPXChart(app, chart, 4); chart.setData(new LineData(getDataSets(GPXTabItemType.GPX_TAB_ITEM_ALTITUDE, chart))); updateChart(chart); @@ -873,7 +872,7 @@ public class TrackSegmentFragment extends OsmAndListFragment { break; case GPX_TAB_ITEM_SPEED: if (analysis != null && analysis.isSpeedSpecified()) { - if (analysis.totalDistance > 0) { + if (analysis.hasSpeedData) { GpxUiHelper.setupGPXChart(app, chart, 4); chart.setData(new LineData(getDataSets(GPXTabItemType.GPX_TAB_ITEM_SPEED, chart))); updateChart(chart); @@ -1013,16 +1012,13 @@ public class TrackSegmentFragment extends OsmAndListFragment { void openDetails(GPXTabItemType tabType) { LatLon location = null; WptPt wpt = null; - gpxItem.chartType = null; + gpxItem.chartTypes = null; List ds = getDataSets(tabType, null); if (ds != null && ds.size() > 0) { - for (ILineDataSet dataSet : ds) { - OrderedLineDataSet orderedDataSet = (OrderedLineDataSet) dataSet; - if (orderedDataSet.getDataSetType() == GPXDataSetType.ALTITUDE) { - gpxItem.chartType = GPXDataSetType.ALTITUDE; - break; - } - gpxItem.chartType = orderedDataSet.getDataSetType(); + gpxItem.chartTypes = new GPXDataSetType[ds.size()]; + for (int i = 0; i < ds.size(); i++) { + OrderedLineDataSet orderedDataSet = (OrderedLineDataSet) ds.get(i); + gpxItem.chartTypes[i] = orderedDataSet.getDataSetType(); } if (gpxItem.chartHighlightPos != -1) { TrkSegment segment = null; diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 6e6eed5708..a3969a1514 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -784,11 +784,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { tb.setPixelDimensions(tbw, tbh); double clat = bottom / 2 + top / 2; - //double clat = 5 * bottom / 4 - top / 4; double clon = left / 2 + right / 2; - // landscape mode -// double clat = bottom / 2 + top / 2; -// double clon = 5 * left / 4 - right / 4; tb.setLatLonCenter(clat, clon); while (tb.getZoom() < 17 && tb.containsLatLon(top, left) && tb.containsLatLon(bottom, right)) { tb.setZoom(tb.getZoom() + 1); @@ -803,8 +799,31 @@ public class OsmandMapTileView implements IMapDownloaderCallback { animatedDraggingThread.startMoving(clat, clon, tb.getZoom(), true); } + public RotatedTileBox getTileBox(int tileBoxWidthPx, int tileBoxHeightPx, int marginTopPx) { + RotatedTileBox tb = currentViewport.copy(); + double border = 0.8; + int dy = 0; + + int tbw = (int) (tb.getPixWidth() * border); + int tbh = (int) (tb.getPixHeight() * border); + if (tileBoxWidthPx > 0) { + tbw = (int) (tileBoxWidthPx * border); + } else if (tileBoxHeightPx > 0) { + tbh = (int) (tileBoxHeightPx * border); + dy = (tb.getPixHeight() - tileBoxHeightPx) / 2 - marginTopPx; + } + tb.setPixelDimensions(tbw, tbh); + + if (dy != 0) { + double clat = tb.getLatFromPixel(tb.getPixWidth() / 2, tb.getPixHeight() / 2 - dy); + double clon = tb.getLonFromPixel(tb.getPixWidth() / 2, tb.getPixHeight() / 2); + tb.setLatLonCenter(clat, clon); + } + return tb; + } + public void fitLocationToMap(double clat, double clon, int zoom, - int tileBoxWidthPx, int tileBoxHeightPx, int marginTopPx) { + int tileBoxWidthPx, int tileBoxHeightPx, int marginTopPx, boolean animated) { RotatedTileBox tb = currentViewport.copy(); int dy = 0; @@ -823,7 +842,11 @@ public class OsmandMapTileView implements IMapDownloaderCallback { clat = tb.getLatFromPixel(tb.getPixWidth() / 2, tb.getPixHeight() / 2 + dy); clon = tb.getLonFromPixel(tb.getPixWidth() / 2, tb.getPixHeight() / 2); } - animatedDraggingThread.startMoving(clat, clon, tb.getZoom(), true); + if (animated) { + animatedDraggingThread.startMoving(clat, clon, tb.getZoom(), true); + } else { + setLatLon(clat, clon); + } } public boolean onGenericMotionEvent(MotionEvent event) {