implement addition layer for info
git-svn-id: https://osmand.googlecode.com/svn/trunk@95 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
4de363414d
commit
635625e813
9 changed files with 202 additions and 11 deletions
|
@ -21,10 +21,7 @@ public class ToDoConstants {
|
|||
|
||||
// 24. Implement ResourceManager, load cities/streets/buildings on Low memory (clear previous all addresses cities).
|
||||
// 5. Search for city/streets/buildings
|
||||
|
||||
// 15. Investigate interruption of any long running operation & implement where it is needed
|
||||
// 11. Print out additional info speed, altitude, number of satellites
|
||||
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
||||
// 21. Implement zooming tile (if tile doesn't exist local, we can zoom in previous tile).
|
||||
|
||||
// 8. Enable change POI directly on map (requires OSM login)
|
||||
|
@ -55,10 +52,12 @@ public class ToDoConstants {
|
|||
|
||||
|
||||
// DONE ANDROID :
|
||||
// 11. Print out additional info speed, altitude, number of satellites
|
||||
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
||||
// 23. Implement moving point from center to bottom (for rotating map)
|
||||
// 17. Enable go to location by specifying coordinates
|
||||
// 9. Configure file log & see log from file (when exception happened to see from device)
|
||||
// 2. Showing compass on the map : use device compass if exists(?)
|
||||
// 2. Showing compass on the map : use device compass if exists(?)
|
||||
// 18. Implement go to point
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.osmand.osm;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
@ -193,5 +194,17 @@ public class MapUtils {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public static String getFormattedDistance(int meters){
|
||||
if(meters >= 100000){
|
||||
return meters / 1000 + " km";
|
||||
} else if(meters >= 10000){
|
||||
return MessageFormat.format("{0, number, #.#} km", ((float) meters) / 1000);
|
||||
} else if(meters > 1500){
|
||||
return MessageFormat.format("{0, number, #.##} km", ((float) meters) / 1000);
|
||||
} else {
|
||||
return meters + " m";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ import com.osmand.ResourceManager;
|
|||
import com.osmand.data.preparation.MapTileDownloader;
|
||||
import com.osmand.map.IMapLocationListener;
|
||||
import com.osmand.osm.LatLon;
|
||||
import com.osmand.views.MapInfoLayer;
|
||||
import com.osmand.views.OsmandMapTileView;
|
||||
import com.osmand.views.POIMapLayer;
|
||||
import com.osmand.views.PointLocationLayer;
|
||||
|
@ -51,11 +52,12 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
private PointLocationLayer locationLayer;
|
||||
private PointNavigationLayer navigationLayer;
|
||||
private POIMapLayer poiMapLayer;
|
||||
private MapInfoLayer mapInfoLayer;
|
||||
|
||||
private WakeLock wakeLock;
|
||||
private boolean sensorRegistered = false;
|
||||
private Handler sensorHandler = new Handler();
|
||||
|
||||
|
||||
private final static String BACK_TO_LOCATION = "BACK_TO_LOCATION";
|
||||
private final static String POINT_NAVIGATE_LAT = "POINT_NAVIGATE_LAT";
|
||||
private final static String POINT_NAVIGATE_LON = "POINT_NAVIGATE_LON";
|
||||
|
@ -83,6 +85,11 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
mapView.addLayer(navigationLayer);
|
||||
locationLayer = new PointLocationLayer();
|
||||
mapView.addLayer(locationLayer);
|
||||
mapInfoLayer = new MapInfoLayer(this);
|
||||
mapView.addLayer(mapInfoLayer);
|
||||
|
||||
|
||||
|
||||
SharedPreferences lprefs = getPreferences(MODE_WORLD_READABLE);
|
||||
if(lprefs.contains(POINT_NAVIGATE_LAT)){
|
||||
navigationLayer.setPointToNavigate(new LatLon(lprefs.getFloat(POINT_NAVIGATE_LAT, 0),
|
||||
|
@ -162,6 +169,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
}
|
||||
|
||||
public void setLocation(Location location){
|
||||
// TODO remove that !!
|
||||
if(location != null){
|
||||
location.setSpeed(30);
|
||||
location.setBearing(90);
|
||||
|
@ -373,5 +381,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
sensorHandler.sendMessage(m);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
148
OsmAnd/src/com/osmand/views/MapInfoLayer.java
Normal file
148
OsmAnd/src/com/osmand/views/MapInfoLayer.java
Normal file
|
@ -0,0 +1,148 @@
|
|||
package com.osmand.views;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Paint.Style;
|
||||
import android.location.Location;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.osmand.activities.MapActivity;
|
||||
import com.osmand.osm.MapUtils;
|
||||
|
||||
public class MapInfoLayer implements OsmandMapLayer {
|
||||
|
||||
|
||||
private OsmandMapTileView view;
|
||||
private final MapActivity map;
|
||||
|
||||
private Paint paintBlack;
|
||||
private Path pathForCompass;
|
||||
private Path pathForCompass2;
|
||||
private Paint fillBlack;
|
||||
private Paint fillRed;
|
||||
private RectF boundsForCompass;
|
||||
private RectF boundsForDist;
|
||||
private RectF boundsForSpeed;
|
||||
private Paint paintAlphaGray;
|
||||
|
||||
|
||||
|
||||
private float[] calculations = new float[1];
|
||||
private String cachedDistString = null;
|
||||
private int cachedMeters = 0;
|
||||
private String cachedSpeedString = null;
|
||||
private int cachedSpeed = 0;
|
||||
|
||||
|
||||
public MapInfoLayer(MapActivity map){
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initLayer(OsmandMapTileView view) {
|
||||
this.view = view;
|
||||
paintBlack = new Paint();
|
||||
paintBlack.setStyle(Style.STROKE);
|
||||
paintBlack.setColor(Color.BLACK);
|
||||
paintBlack.setTextSize(18);
|
||||
paintBlack.setAntiAlias(true);
|
||||
|
||||
paintAlphaGray = new Paint();
|
||||
paintAlphaGray.setStyle(Style.FILL_AND_STROKE);
|
||||
paintAlphaGray.setColor(Color.LTGRAY);
|
||||
paintAlphaGray.setAlpha(150);
|
||||
|
||||
fillBlack = new Paint();
|
||||
fillBlack.setStyle(Style.FILL_AND_STROKE);
|
||||
fillBlack.setColor(Color.BLACK);
|
||||
fillBlack.setAntiAlias(true);
|
||||
|
||||
fillRed = new Paint();
|
||||
fillRed.setStyle(Style.FILL_AND_STROKE);
|
||||
fillRed.setColor(Color.RED);
|
||||
fillRed.setAntiAlias(true);
|
||||
|
||||
boundsForCompass = new RectF(0, 0, 32, 32);
|
||||
boundsForDist = new RectF(32, 0, 110, 32);
|
||||
boundsForSpeed = new RectF(0, 32, 110, 64);
|
||||
|
||||
pathForCompass = new Path();
|
||||
pathForCompass.moveTo(9, 15.5f);
|
||||
pathForCompass.lineTo(22f, 15.5f);
|
||||
pathForCompass.lineTo(15.5f, 30f);
|
||||
pathForCompass.lineTo(9, 15.5f);
|
||||
|
||||
pathForCompass2 = new Path();
|
||||
pathForCompass2.moveTo(9, 15.5f);
|
||||
pathForCompass2.lineTo(22f, 15.5f);
|
||||
pathForCompass2.lineTo(15.5f, 2f);
|
||||
pathForCompass2.lineTo(9, 15);
|
||||
}
|
||||
|
||||
public boolean distChanged(int oldDist, int dist){
|
||||
if(oldDist != 0 && Math.abs(((float) dist - oldDist)/oldDist) < 0.01){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
if(map.getPointToNavigate() != null){
|
||||
Location.distanceBetween(view.getLatitude(), view.getLongitude(), map.getPointToNavigate().getLatitude(),
|
||||
map.getPointToNavigate().getLongitude(), calculations);
|
||||
if(distChanged(cachedMeters, (int)calculations[0])){
|
||||
cachedMeters = (int)calculations[0];
|
||||
if(cachedMeters <= 20){
|
||||
cachedMeters = 0;
|
||||
cachedDistString = null;
|
||||
} else {
|
||||
cachedDistString = MapUtils.getFormattedDistance(cachedMeters);
|
||||
boundsForDist.right = paintBlack.measureText(cachedDistString) + 25 + boundsForDist.left;
|
||||
boundsForSpeed.right = boundsForDist.right;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(map.getLastKnownLocation() != null && map.getLastKnownLocation().hasSpeed()){
|
||||
if(cachedSpeed != (int) map.getLastKnownLocation().getSpeed()){
|
||||
cachedSpeed = (int) map.getLastKnownLocation().getSpeed();
|
||||
cachedSpeedString = ((int) (cachedSpeed * 3.6d)) + " km/h";
|
||||
}
|
||||
if(cachedSpeed > 0){
|
||||
canvas.drawRoundRect(boundsForSpeed, 3, 3, paintAlphaGray);
|
||||
canvas.drawText(cachedSpeedString, boundsForSpeed.left + 5, boundsForSpeed.bottom - 9, paintBlack);
|
||||
}
|
||||
}
|
||||
if(cachedDistString != null){
|
||||
canvas.drawRoundRect(boundsForDist, 3, 3, paintAlphaGray);
|
||||
canvas.drawCircle(boundsForDist.left + 8, boundsForDist.bottom - 15, 4, fillRed);
|
||||
canvas.drawText(cachedDistString, boundsForDist.left + 15, boundsForDist.bottom - 9, paintBlack);
|
||||
}
|
||||
|
||||
// draw the last because it use rotating
|
||||
canvas.drawRoundRect(boundsForCompass, 3, 3, paintAlphaGray);
|
||||
canvas.rotate(view.getRotate(), 15, 15);
|
||||
canvas.drawPath(pathForCompass2, fillRed);
|
||||
canvas.drawPath(pathForCompass, fillBlack);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyLayer() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean drawInScreenPixels() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -13,5 +13,7 @@ public interface OsmandMapLayer {
|
|||
public void destroyLayer();
|
||||
|
||||
public boolean onTouchEvent(MotionEvent event);
|
||||
|
||||
public boolean drawInScreenPixels();
|
||||
|
||||
}
|
||||
|
|
|
@ -273,9 +273,17 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
|||
|
||||
|
||||
private void drawOverMap(Canvas canvas){
|
||||
canvas.drawCircle(getCenterPointX(), getCenterPointY(), 3, paintBlack);
|
||||
canvas.drawCircle(getCenterPointX(), getCenterPointY(), 6, paintBlack);
|
||||
for(OsmandMapLayer layer : layers){
|
||||
int w = getCenterPointX();
|
||||
int h = getCenterPointY();
|
||||
canvas.drawCircle(w, h, 3, paintBlack);
|
||||
canvas.drawCircle(w, h, 6, paintBlack);
|
||||
|
||||
for (OsmandMapLayer layer : layers) {
|
||||
canvas.restore();
|
||||
canvas.save();
|
||||
if (!layer.drawInScreenPixels()) {
|
||||
canvas.rotate(rotate, w, h);
|
||||
}
|
||||
layer.onDraw(canvas);
|
||||
}
|
||||
}
|
||||
|
@ -332,7 +340,7 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
|||
if (canvas != null) {
|
||||
ResourceManager mgr = ResourceManager.getResourceManager();
|
||||
boolean useInternet = OsmandSettings.isUsingInternetToDownloadTiles(getContext());
|
||||
|
||||
canvas.save();
|
||||
canvas.rotate(rotate, w , h);
|
||||
boundsRect.set(0, 0, getWidth(), getHeight());
|
||||
calculateTileRectangle(boundsRect, w, h, tileX, tileY, tilesRect);
|
||||
|
|
|
@ -105,4 +105,9 @@ public class POIMapLayer implements OsmandMapLayer {
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean drawInScreenPixels() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -155,6 +155,11 @@ public class PointLocationLayer implements OsmandMapLayer {
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean drawInScreenPixels() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -98,7 +98,9 @@ public class PointNavigationLayer implements OsmandMapLayer {
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean drawInScreenPixels() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue