Add split km view to GPX layer (visible on map)
This commit is contained in:
parent
bb7f279b58
commit
8bb4e6fda4
6 changed files with 155 additions and 55 deletions
|
@ -36,6 +36,8 @@
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
|
android:layout_marginLeft="3dp"
|
||||||
|
android:layout_marginTop="3dp"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:text="@string/osmo_enable_tracker" />
|
android:text="@string/osmo_enable_tracker" />
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
|
android:layout_marginLeft="3dp"
|
||||||
|
android:layout_marginTop="3dp"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:text="@string/osmo_enable_tracker" />
|
android:text="@string/osmo_enable_tracker" />
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import net.osmand.plus.GPXUtilities.Route;
|
||||||
import net.osmand.plus.GPXUtilities.Track;
|
import net.osmand.plus.GPXUtilities.Track;
|
||||||
import net.osmand.plus.GPXUtilities.TrkSegment;
|
import net.osmand.plus.GPXUtilities.TrkSegment;
|
||||||
import net.osmand.plus.GPXUtilities.WptPt;
|
import net.osmand.plus.GPXUtilities.WptPt;
|
||||||
|
import net.osmand.plus.OsmandSettings.MetricsConstants;
|
||||||
import net.osmand.plus.activities.SavingTrackHelper;
|
import net.osmand.plus.activities.SavingTrackHelper;
|
||||||
import net.osmand.plus.helpers.GpxUiHelper;
|
import net.osmand.plus.helpers.GpxUiHelper;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
@ -191,6 +192,7 @@ public class GpxSelectionHelper {
|
||||||
item.group = group;
|
item.group = group;
|
||||||
if(split) {
|
if(split) {
|
||||||
item.splitMetric = analysis.metricEnd;
|
item.splitMetric = analysis.metricEnd;
|
||||||
|
item.splitName = formatSplitName(analysis.metricEnd, group, app);
|
||||||
}
|
}
|
||||||
|
|
||||||
item.description = GpxUiHelper.getDescription(app, analysis, true);
|
item.description = GpxUiHelper.getDescription(app, analysis, true);
|
||||||
|
@ -244,6 +246,29 @@ public class GpxSelectionHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String formatSplitName(double metricEnd, GpxDisplayGroup group, OsmandApplication app) {
|
||||||
|
if (group.isSplitDistance()) {
|
||||||
|
MetricsConstants mc = app.getSettings().METRIC_SYSTEM.get();
|
||||||
|
if (mc == MetricsConstants.KILOMETERS_AND_METERS) {
|
||||||
|
final double sd = group.getSplitDistance();
|
||||||
|
int digits = sd < 100 ? 2 : (sd < 1000 ? 1 : 0);
|
||||||
|
int rem1000 = (int) (metricEnd + 0.5) % 1000;
|
||||||
|
if (rem1000 > 1 && digits < 1) {
|
||||||
|
digits = 1;
|
||||||
|
}
|
||||||
|
int rem100 = (int) (metricEnd + 0.5) % 100;
|
||||||
|
if (rem100 > 1 && digits < 2) {
|
||||||
|
digits = 2;
|
||||||
|
}
|
||||||
|
return OsmAndFormatter.getFormattedRoundDistanceKm((float) metricEnd, digits, app);
|
||||||
|
} else {
|
||||||
|
return OsmAndFormatter.getFormattedDistance((float) metricEnd, app);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Algorithms.formatDuration((int) metricEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public SelectedGpxFile getSelectedFileByPath(String path) {
|
public SelectedGpxFile getSelectedFileByPath(String path) {
|
||||||
for(SelectedGpxFile s : selectedGPXFiles) {
|
for(SelectedGpxFile s : selectedGPXFiles) {
|
||||||
if(s.getGpxFile().path.equals(path)) {
|
if(s.getGpxFile().path.equals(path)) {
|
||||||
|
@ -403,6 +428,10 @@ public class GpxSelectionHelper {
|
||||||
return processedPointsToDisplay;
|
return processedPointsToDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<GpxDisplayGroup> getDisplayGroups() {
|
||||||
|
return displayGroups;
|
||||||
|
}
|
||||||
|
|
||||||
public GPXFile getGpxFile() {
|
public GPXFile getGpxFile() {
|
||||||
return gpxFile;
|
return gpxFile;
|
||||||
}
|
}
|
||||||
|
@ -545,6 +574,7 @@ public class GpxSelectionHelper {
|
||||||
public WptPt locationStart;
|
public WptPt locationStart;
|
||||||
public WptPt locationEnd;
|
public WptPt locationEnd;
|
||||||
public double splitMetric = -1;
|
public double splitMetric = -1;
|
||||||
|
public String splitName;
|
||||||
public String name;
|
public String name;
|
||||||
public String description;
|
public String description;
|
||||||
public String url;
|
public String url;
|
||||||
|
|
|
@ -525,30 +525,10 @@ public class SelectedGPXFragment extends OsmandExpandableListFragment {
|
||||||
TextView description = (TextView) row.findViewById(R.id.description);
|
TextView description = (TextView) row.findViewById(R.id.description);
|
||||||
TextView additional = (TextView) row.findViewById(R.id.additional);
|
TextView additional = (TextView) row.findViewById(R.id.additional);
|
||||||
ImageView icon = (ImageView) row.findViewById(R.id.icon);
|
ImageView icon = (ImageView) row.findViewById(R.id.icon);
|
||||||
if(child.splitMetric >= 0) {
|
if(child.splitMetric >= 0 && child.splitName != null) {
|
||||||
additional.setVisibility(View.VISIBLE);
|
additional.setVisibility(View.VISIBLE);
|
||||||
icon.setVisibility(View.INVISIBLE);
|
icon.setVisibility(View.INVISIBLE);
|
||||||
if(child.group.isSplitDistance()) {
|
additional.setText(child.splitName);
|
||||||
MetricsConstants mc = app.getSettings().METRIC_SYSTEM.get();
|
|
||||||
if (mc == MetricsConstants.KILOMETERS_AND_METERS) {
|
|
||||||
final double sd = child.group.getSplitDistance();
|
|
||||||
int digits = sd < 100 ? 2 : (sd < 1000 ? 1 : 0);
|
|
||||||
int rem1000 = (int) (child.splitMetric + 0.5) % 1000;
|
|
||||||
if (rem1000 > 1 && digits < 1) {
|
|
||||||
digits = 1;
|
|
||||||
}
|
|
||||||
int rem100 = (int) (child.splitMetric + 0.5) % 100;
|
|
||||||
if (rem100 > 1 && digits < 2) {
|
|
||||||
digits = 2;
|
|
||||||
}
|
|
||||||
additional.setText(OsmAndFormatter.getFormattedRoundDistanceKm((float) child.splitMetric,
|
|
||||||
digits, app));
|
|
||||||
} else {
|
|
||||||
additional.setText(OsmAndFormatter.getFormattedDistance((float) child.splitMetric, app));
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
additional.setText(Algorithms.formatDuration((int) child.splitMetric));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
icon.setVisibility(View.VISIBLE);
|
icon.setVisibility(View.VISIBLE);
|
||||||
additional.setVisibility(View.INVISIBLE);
|
additional.setVisibility(View.INVISIBLE);
|
||||||
|
|
|
@ -219,7 +219,7 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
|
||||||
if (uname.length() > 7 && uname.indexOf(' ') != -1) {
|
if (uname.length() > 7 && uname.indexOf(' ') != -1) {
|
||||||
uname = uname.substring(0, uname.indexOf(' '));
|
uname = uname.substring(0, uname.indexOf(' '));
|
||||||
}
|
}
|
||||||
if (uname.length() > 4 && uname.indexOf(' ') != -1) {
|
if (uname.length() > 4) {
|
||||||
txt = "";
|
txt = "";
|
||||||
subtxt = uname;
|
subtxt = uname;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -9,6 +9,8 @@ import net.osmand.data.QuadRect;
|
||||||
import net.osmand.data.RotatedTileBox;
|
import net.osmand.data.RotatedTileBox;
|
||||||
import net.osmand.plus.GPXUtilities.WptPt;
|
import net.osmand.plus.GPXUtilities.WptPt;
|
||||||
import net.osmand.plus.GpxSelectionHelper;
|
import net.osmand.plus.GpxSelectionHelper;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.base.FavoriteImageDrawable;
|
import net.osmand.plus.base.FavoriteImageDrawable;
|
||||||
|
@ -16,8 +18,10 @@ import net.osmand.plus.views.MapTextLayer.MapTextProvider;
|
||||||
import net.osmand.render.RenderingRuleSearchRequest;
|
import net.osmand.render.RenderingRuleSearchRequest;
|
||||||
import net.osmand.render.RenderingRulesStorage;
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.DashPathEffect;
|
import android.graphics.DashPathEffect;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Paint.Align;
|
||||||
import android.graphics.Paint.Cap;
|
import android.graphics.Paint.Cap;
|
||||||
import android.graphics.Paint.Join;
|
import android.graphics.Paint.Join;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
|
@ -47,6 +51,12 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
||||||
|
|
||||||
private DashPathEffect pathEffect;
|
private DashPathEffect pathEffect;
|
||||||
|
|
||||||
|
private Paint paintOuter;
|
||||||
|
|
||||||
|
private Paint paintInnerCircle;
|
||||||
|
|
||||||
|
private Paint paintTextIcon;
|
||||||
|
|
||||||
// private Drawable favoriteIcon;
|
// private Drawable favoriteIcon;
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,9 +75,24 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
||||||
paintBmp.setFilterBitmap(true);
|
paintBmp.setFilterBitmap(true);
|
||||||
paintBmp.setDither(true);
|
paintBmp.setDither(true);
|
||||||
|
|
||||||
|
paintTextIcon = new Paint();
|
||||||
|
paintTextIcon.setTextSize(10 * view.getDensity());
|
||||||
|
paintTextIcon.setTextAlign(Align.CENTER);
|
||||||
|
paintTextIcon.setFakeBoldText(true);
|
||||||
|
paintTextIcon.setColor(Color.BLACK);
|
||||||
|
paintTextIcon.setAntiAlias(true);
|
||||||
|
|
||||||
textLayer = view.getLayerByClass(MapTextLayer.class);
|
textLayer = view.getLayerByClass(MapTextLayer.class);
|
||||||
//favoriteIcon = BitmapFactory.decodeResource(view.getResources(), R.drawable.poi_favourite);
|
//favoriteIcon = BitmapFactory.decodeResource(view.getResources(), R.drawable.poi_favourite);
|
||||||
|
|
||||||
|
paintOuter = new Paint();
|
||||||
|
paintOuter.setColor(0x88555555);
|
||||||
|
paintOuter.setAntiAlias(true);
|
||||||
|
paintOuter.setStyle(Style.FILL_AND_STROKE);
|
||||||
|
paintInnerCircle = new Paint();
|
||||||
|
paintInnerCircle.setStyle(Style.FILL_AND_STROKE);
|
||||||
|
paintInnerCircle.setColor(0xddFFFFFF);
|
||||||
|
paintInnerCircle.setAntiAlias(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -101,19 +126,72 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
||||||
@Override
|
@Override
|
||||||
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||||
List<SelectedGpxFile> selectedGPXFiles = selectedGpxHelper.getSelectedGPXFiles();
|
List<SelectedGpxFile> selectedGPXFiles = selectedGpxHelper.getSelectedGPXFiles();
|
||||||
int clr = getColor(settings);
|
|
||||||
cache.clear();
|
cache.clear();
|
||||||
|
if (!selectedGPXFiles.isEmpty()) {
|
||||||
|
drawSelectedFilesSegments(canvas, tileBox, selectedGPXFiles, settings);
|
||||||
|
canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
|
||||||
|
drawSelectedFilesSplits(canvas, tileBox, selectedGPXFiles, settings);
|
||||||
|
drawSelectedFilesPoints(canvas, tileBox, selectedGPXFiles);
|
||||||
|
}
|
||||||
|
if(textLayer.isVisible()) {
|
||||||
|
textLayer.putData(this, cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawSelectedFilesSplits(Canvas canvas, RotatedTileBox tileBox, List<SelectedGpxFile> selectedGPXFiles,
|
||||||
|
DrawSettings settings) {
|
||||||
|
if (tileBox.getZoom() >= startZoom) {
|
||||||
|
// request to load
|
||||||
|
for (SelectedGpxFile g : selectedGPXFiles) {
|
||||||
|
List<GpxDisplayGroup> groups = g.getDisplayGroups();
|
||||||
|
if (groups != null) {
|
||||||
|
for (GpxDisplayGroup group : groups) {
|
||||||
|
List<GpxDisplayItem> items = group.getModifiableList();
|
||||||
|
drawSplitItems(canvas, tileBox, items, settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawSplitItems(Canvas canvas, RotatedTileBox tileBox, List<GpxDisplayItem> items, DrawSettings settings) {
|
||||||
|
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
||||||
|
int r = (int) (12 * tileBox.getDensity());
|
||||||
|
int dr = r * 3 / 2;
|
||||||
|
int px = -1;
|
||||||
|
int py = -1;
|
||||||
|
for(int k = 0; k < items.size(); k++) {
|
||||||
|
GpxDisplayItem i = items.get(k);
|
||||||
|
WptPt o = i.locationEnd;
|
||||||
|
if (o != null && o.lat >= latLonBounds.bottom && o.lat <= latLonBounds.top && o.lon >= latLonBounds.left
|
||||||
|
&& o.lon <= latLonBounds.right) {
|
||||||
|
int x = (int) tileBox.getPixXFromLatLon(o.lat, o.lon);
|
||||||
|
int y = (int) tileBox.getPixYFromLatLon(o.lat, o.lon);
|
||||||
|
if (px != -1 || py != -1) {
|
||||||
|
if (Math.abs(x - px) <= dr && Math.abs(y - py) <= dr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
px = x;
|
||||||
|
py = y;
|
||||||
|
String nm = i.splitName;
|
||||||
|
if (nm != null) {
|
||||||
|
int ind = nm.indexOf(' ');
|
||||||
|
if (ind > 0) {
|
||||||
|
nm = nm.substring(0, ind);
|
||||||
|
}
|
||||||
|
canvas.drawCircle(x, y, r + (float) Math.ceil(tileBox.getDensity()), paintOuter);
|
||||||
|
canvas.drawCircle(x, y, r - (float) Math.ceil(tileBox.getDensity()), paintInnerCircle);
|
||||||
|
paintTextIcon.setTextSize(r);
|
||||||
|
canvas.drawText(nm, x, y + r / 2, paintTextIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawSelectedFilesPoints(Canvas canvas, RotatedTileBox tileBox, List<SelectedGpxFile> selectedGPXFiles) {
|
||||||
int defPointColor = view.getResources().getColor(R.color.gpx_color_point);
|
int defPointColor = view.getResources().getColor(R.color.gpx_color_point);
|
||||||
int visitedColor = view.getContext().getResources().getColor(R.color.color_ok);
|
int visitedColor = view.getContext().getResources().getColor(R.color.color_ok);
|
||||||
if (!selectedGPXFiles.isEmpty()) {
|
|
||||||
for (SelectedGpxFile g : selectedGPXFiles) {
|
|
||||||
List<List<WptPt>> points = g.getPointsToDisplay();
|
|
||||||
boolean routePoints = g.isRoutePoints();
|
|
||||||
int fcolor = g.getColor() == 0 ? clr : g.getColor();
|
|
||||||
paint.setColor(fcolor);
|
|
||||||
drawSegments(canvas, tileBox, points, routePoints);
|
|
||||||
}
|
|
||||||
canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
|
|
||||||
if (tileBox.getZoom() >= startZoom) {
|
if (tileBox.getZoom() >= startZoom) {
|
||||||
// request to load
|
// request to load
|
||||||
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
||||||
|
@ -138,8 +216,16 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(textLayer.isVisible()) {
|
|
||||||
textLayer.putData(this, cache);
|
private void drawSelectedFilesSegments(Canvas canvas, RotatedTileBox tileBox,
|
||||||
|
List<SelectedGpxFile> selectedGPXFiles, DrawSettings settings) {
|
||||||
|
int clr = getColor(settings);
|
||||||
|
for (SelectedGpxFile g : selectedGPXFiles) {
|
||||||
|
List<List<WptPt>> points = g.getPointsToDisplay();
|
||||||
|
boolean routePoints = g.isRoutePoints();
|
||||||
|
int fcolor = g.getColor() == 0 ? clr : g.getColor();
|
||||||
|
paint.setColor(fcolor);
|
||||||
|
drawSegments(canvas, tileBox, points, routePoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue