From 6de5f60c4efaebba32aea24ba2238b6f93149af7 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 3 Aug 2010 21:59:22 +0000 Subject: [PATCH] add support for diff screens (map) git-svn-id: https://osmand.googlecode.com/svn/trunk@434 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8 --- .../src/com/osmand/ToDoConstants.java | 9 +- .../views/AnimateDraggingMapThread.java | 2 +- OsmAnd/src/com/osmand/views/MapInfoLayer.java | 143 ++++++++++++------ .../com/osmand/views/OsmandMapTileView.java | 16 +- 4 files changed, 111 insertions(+), 59 deletions(-) diff --git a/DataExtractionOSM/src/com/osmand/ToDoConstants.java b/DataExtractionOSM/src/com/osmand/ToDoConstants.java index eca7d8fb11..a868f738e3 100644 --- a/DataExtractionOSM/src/com/osmand/ToDoConstants.java +++ b/DataExtractionOSM/src/com/osmand/ToDoConstants.java @@ -26,10 +26,11 @@ public class ToDoConstants { // 3.2 Fix all layers (RouteInfoLayer+! // FavoritesLayer, OsmBugsLayer, POIMapLayer, TransportInfoLayer, TransportStopsLayer (+) // PointLocationLayer, PointNavigationLayer, YandexTrafficLayer(+) - // 3.3 route_info_list_item.xml, ShowRouteInfoActivity, main.xml (+) - // 3.4 Fix map zoom by default map (in 1.5 for high density) OsmandMapTileView - // 3.5 MapInfoLayer - // 3.6 Touch distance events : MultiTouchSupport, AnimateDraggingMapThread (? timeMove) + // 3.3 route_info_list_item.xml, ShowRouteInfoActivity, main.xml (+) + // 3.4 MapInfoLayer (+) + // 3.5 Touch distance events : MultiTouchSupport, AnimateDraggingMapThread (? timeMove) (+) + + // 3.6 Fix map zoom by default map (in 1.5 for high density) OsmandMapTileView // 4. Icon back to location (+) // Improvements diff --git a/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java b/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java index 8a6ac8ec09..1274590c07 100644 --- a/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java +++ b/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java @@ -226,7 +226,7 @@ public class AnimateDraggingMapThread implements Runnable { // } timeZInt = 600; timeZEnd = 500; - timeMove = (int) (Math.abs(moveX) + Math.abs(moveY) * 4); + timeMove = (int) (Math.abs(moveX) + Math.abs(moveY) * 3); if(timeMove > 2200){ timeMove = 2200; } diff --git a/OsmAnd/src/com/osmand/views/MapInfoLayer.java b/OsmAnd/src/com/osmand/views/MapInfoLayer.java index 263af8d2e2..8caa017b7d 100644 --- a/OsmAnd/src/com/osmand/views/MapInfoLayer.java +++ b/OsmAnd/src/com/osmand/views/MapInfoLayer.java @@ -1,5 +1,6 @@ package com.osmand.views; +import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; @@ -7,11 +8,15 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.RectF; +import android.graphics.Paint.Cap; +import android.graphics.Paint.Join; import android.graphics.Paint.Style; import android.location.Location; import android.text.format.DateFormat; +import android.util.DisplayMetrics; import android.util.FloatMath; import android.view.View; +import android.view.WindowManager; import com.osmand.Algoritms; import com.osmand.Messages; @@ -69,6 +74,10 @@ public class MapInfoLayer implements OsmandMapLayer { private Matrix pathTransform; private TurnType cachedTurnType = null; private String cachedExitOut = null; + private DisplayMetrics dm; + + private float scaleCoefficient; + private float roundCorner; public MapInfoLayer(MapActivity map, RouteLayer layer){ @@ -80,9 +89,20 @@ public class MapInfoLayer implements OsmandMapLayer { public void initLayer(OsmandMapTileView view) { this.view = view; paintBlack = new Paint(); + WindowManager mgr = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE); + dm = new DisplayMetrics(); + mgr.getDefaultDisplay().getMetrics(dm); + scaleCoefficient = dm.density; + if(Math.min(dm.widthPixels/dm.densityDpi, dm.heightPixels/dm.densityDpi) > 2.5f){ + // large screen + scaleCoefficient *= 1.5f; + } + + roundCorner = 3* scaleCoefficient; + paintBlack.setStyle(Style.STROKE); paintBlack.setColor(Color.BLACK); - paintBlack.setTextSize(23); + paintBlack.setTextSize(23 * scaleCoefficient); paintBlack.setAntiAlias(true); paintAlphaGray = new Paint(); @@ -102,8 +122,10 @@ public class MapInfoLayer implements OsmandMapLayer { paintMiniRoute = new Paint(); paintMiniRoute.setStyle(Style.STROKE); - paintMiniRoute.setStrokeWidth(35); + paintMiniRoute.setStrokeWidth(35 * scaleCoefficient); paintMiniRoute.setColor(Color.BLUE); + paintMiniRoute.setStrokeJoin(Join.ROUND); + paintMiniRoute.setStrokeCap(Cap.ROUND); paintMiniRoute.setAntiAlias(true); fillRed = new Paint(); @@ -118,30 +140,48 @@ public class MapInfoLayer implements OsmandMapLayer { boundsForMiniRoute = new RectF(0, 64, 96, 196); boundsForLeftTime = new RectF(0, 0, 75, 32); + + // Scale to have proper view + scaleRect(boundsForCompass); + scaleRect(boundsForDist); + scaleRect(boundsForZoom); + scaleRect(boundsForSpeed); + scaleRect(boundsForMiniRoute); + scaleRect(boundsForLeftTime); - centerMiniRouteX = 48; - centerMiniRouteY= 160; + + centerMiniRouteX = (int) (boundsForMiniRoute.width()/2); + centerMiniRouteY= (int) (boundsForMiniRoute.top + 3 * boundsForMiniRoute.height() /4); scaleMiniRoute = 0.15f; pathForCompass = new Path(); - pathForCompass.moveTo(9, 15.5f); - pathForCompass.lineTo(22f, 15.5f); - pathForCompass.lineTo(15.5f, 30f); - pathForCompass.lineTo(9, 15.5f); - + pathForCompass.moveTo(9 * scaleCoefficient, 15.5f * scaleCoefficient); + pathForCompass.lineTo(22f * scaleCoefficient, 15.5f * scaleCoefficient); + pathForCompass.lineTo(15.5f * scaleCoefficient, 30f * scaleCoefficient); + pathForCompass.lineTo(9 * scaleCoefficient, 15.5f * scaleCoefficient); + pathForCompass2 = new Path(); - pathForCompass2.moveTo(9, 15.5f); - pathForCompass2.lineTo(22f, 15.5f); - pathForCompass2.lineTo(15.5f, 2f); - pathForCompass2.lineTo(9, 15); + pathForCompass2.moveTo(9 * scaleCoefficient, 15.5f * scaleCoefficient); + pathForCompass2.lineTo(22f * scaleCoefficient, 15.5f * scaleCoefficient); + pathForCompass2.lineTo(15.5f * scaleCoefficient, 2f * scaleCoefficient); + pathForCompass2.lineTo(9 * scaleCoefficient, 15.5f * scaleCoefficient); pathForTurn = new Path(); pathTransform = new Matrix(); - pathTransform.setTranslate(boundsForMiniRoute.left, boundsForMiniRoute.top); + pathTransform.postScale(scaleCoefficient, scaleCoefficient); + pathTransform.postTranslate(boundsForMiniRoute.left, boundsForMiniRoute.top); + showArrivalTime = OsmandSettings.isShowingArrivalTime(view.getContext()); } + + private void scaleRect(RectF r){ + r.bottom *= scaleCoefficient; + r.left *= scaleCoefficient; + r.right *= scaleCoefficient; + r.top *= scaleCoefficient; + } public boolean distChanged(int oldDist, int dist){ if(oldDist != 0 && oldDist - dist < 100 && Math.abs(((float) dist - oldDist)/oldDist) < 0.01){ @@ -170,7 +210,7 @@ public class MapInfoLayer implements OsmandMapLayer { cachedDistString = null; } else { cachedDistString = MapUtils.getFormattedDistance(cachedMeters); - float right = paintBlack.measureText(cachedDistString) + 25 + boundsForDist.left; + float right = paintBlack.measureText(cachedDistString) + 25 * scaleCoefficient + boundsForDist.left; if(cachedSpeedString != null){ boundsForSpeed.right = boundsForDist.right = Math.max(right, boundsForDist.right); } else { @@ -187,30 +227,33 @@ public class MapInfoLayer implements OsmandMapLayer { cachedZoomString = view.getZoom()+""; //$NON-NLS-1$ } // draw zoom - canvas.drawRoundRect(boundsForZoom, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForZoom, 3, 3, paintBlack); - canvas.drawText(cachedZoomString, boundsForZoom.left + 5, boundsForZoom.bottom - 7, paintBlack); + canvas.drawRoundRect(boundsForZoom, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForZoom, roundCorner, roundCorner, paintBlack); + canvas.drawText(cachedZoomString, boundsForZoom.left + 5 * scaleCoefficient, boundsForZoom.bottom - 8 * scaleCoefficient, + paintBlack); // draw speed if(map.getLastKnownLocation() != null && map.getLastKnownLocation().hasSpeed()){ if(Math.abs(map.getLastKnownLocation().getSpeed() - cachedSpeed) > .3f){ cachedSpeed = map.getLastKnownLocation().getSpeed(); cachedSpeedString = ((int) (cachedSpeed * 3.6f)) + Messages.getMessage(Messages.KEY_KM_H); - float right = paintBlack.measureText(cachedSpeedString) + 8 + boundsForSpeed.left; + float right = paintBlack.measureText(cachedSpeedString) + 8 * scaleCoefficient + boundsForSpeed.left; boundsForSpeed.right = boundsForDist.right = Math.max(right, boundsForDist.right); } if(cachedSpeed > 0){ - canvas.drawRoundRect(boundsForSpeed, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForSpeed, 3, 3, paintBlack); - canvas.drawText(cachedSpeedString, boundsForSpeed.left + 8, boundsForSpeed.bottom - 9, paintBlack); + canvas.drawRoundRect(boundsForSpeed, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForSpeed, roundCorner, roundCorner, paintBlack); + canvas.drawText(cachedSpeedString, boundsForSpeed.left + 8 * scaleCoefficient, boundsForSpeed.bottom - 9f * scaleCoefficient, paintBlack); } } // draw distance to point if(cachedDistString != null){ - canvas.drawRoundRect(boundsForDist, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForDist, 3, 3, paintBlack); - canvas.drawCircle(boundsForDist.left + 8, boundsForDist.bottom - 15, 4, fillRed); - canvas.drawText(cachedDistString, boundsForDist.left + 15, boundsForDist.bottom - 9, paintBlack); + canvas.drawRoundRect(boundsForDist, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForDist, roundCorner, roundCorner, paintBlack); + canvas.drawCircle(boundsForDist.left + 8 * scaleCoefficient, boundsForDist.bottom - 15 * scaleCoefficient, + 4 * scaleCoefficient, fillRed); + canvas.drawText(cachedDistString, boundsForDist.left + 15 * scaleCoefficient, boundsForDist.bottom - 9f * scaleCoefficient, + paintBlack); } // draw ruler @@ -219,10 +262,10 @@ public class MapInfoLayer implements OsmandMapLayer { // draw route information drawRouteInfo(canvas); - // draw compass the last because it use rotating - canvas.drawRoundRect(boundsForCompass, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForCompass, 3, 3, paintBlack); - canvas.rotate(view.getRotate(), 15, 15); + // draw compass the last (!) because it use rotating + canvas.drawRoundRect(boundsForCompass, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForCompass, roundCorner, roundCorner, paintBlack); + canvas.rotate(view.getRotate(), 15 * scaleCoefficient, 15 * scaleCoefficient); canvas.drawPath(pathForCompass2, fillRed); canvas.drawPath(pathForCompass, fillBlack); } @@ -271,21 +314,21 @@ public class MapInfoLayer implements OsmandMapLayer { rulerDistPix = (int) (view.getWidth() * screenPercent / dist * baseDist); rulerDistName = MapUtils.getFormattedDistance(baseDist); - rulerBaseLine = view.getHeight() - 70; + rulerBaseLine = (int) (view.getHeight() - 70 * dm.density); if(view.getParent() instanceof View){ View zoomControls = ((View) view.getParent()).findViewById(R.id.ZoomControls); if(zoomControls != null){ - rulerBaseLine = zoomControls.getTop() - 5; + rulerBaseLine = (int) (zoomControls.getTop() - 5 * dm.density); } } rulerTextLen = paintBlack.measureText(rulerDistName); } if (rulerDistName != null) { - int w2 = view.getWidth() - 5; + int w2 = (int) (view.getWidth() - 5 * dm.density); canvas.drawLine(w2 - rulerDistPix, rulerBaseLine, w2, rulerBaseLine, paintBlack); - canvas.drawLine(w2 - rulerDistPix, rulerBaseLine, w2 - rulerDistPix, rulerBaseLine - 10, paintBlack); - canvas.drawLine(w2, rulerBaseLine, w2, rulerBaseLine - 10, paintBlack); - canvas.drawText(rulerDistName, w2 - (rulerDistPix + rulerTextLen)/2 + 1, rulerBaseLine - 5, paintBlack); + canvas.drawLine(w2 - rulerDistPix, rulerBaseLine, w2 - rulerDistPix, rulerBaseLine - 10 * dm.density, paintBlack); + canvas.drawLine(w2, rulerBaseLine, w2, rulerBaseLine - 10 * dm.density, paintBlack); + canvas.drawText(rulerDistName, w2 - (rulerDistPix + rulerTextLen)/2 + 1, rulerBaseLine - 5 * dm.density, paintBlack); } } @@ -297,8 +340,8 @@ public class MapInfoLayer implements OsmandMapLayer { if (!routeLayer.getPath().isEmpty()) { canvas.save(); canvas.clipRect(boundsForMiniRoute); - canvas.drawRoundRect(boundsForMiniRoute, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForMiniRoute, 3, 3, paintBlack); + canvas.drawRoundRect(boundsForMiniRoute, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForMiniRoute, roundCorner, roundCorner, paintBlack); canvas.translate(centerMiniRouteX - view.getCenterPointX(), centerMiniRouteY - view.getCenterPointY()); canvas.scale(scaleMiniRoute, scaleMiniRoute, view.getCenterPointX(), view.getCenterPointY()); canvas.rotate(view.getRotate(), view.getCenterPointX(), view.getCenterPointY()); @@ -307,8 +350,8 @@ public class MapInfoLayer implements OsmandMapLayer { canvas.restore(); } } else { - canvas.drawRoundRect(boundsForMiniRoute, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForMiniRoute, 3, 3, paintBlack); + canvas.drawRoundRect(boundsForMiniRoute, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForMiniRoute, roundCorner, roundCorner, paintBlack); RouteDirectionInfo next = routeLayer.getHelper().getNextRouteDirectionInfo(); if (next != null) { if (!Algoritms.objectEquals(cachedTurnType, next.turnType)) { @@ -323,10 +366,11 @@ public class MapInfoLayer implements OsmandMapLayer { canvas.drawPath(pathForTurn, paintRouteDirection); canvas.drawPath(pathForTurn, paintBlack); if (cachedExitOut != null) { - canvas.drawText(cachedExitOut, boundsForMiniRoute.centerX() - 6, boundsForMiniRoute.centerY() - 9, paintBlack); + canvas.drawText(cachedExitOut, boundsForMiniRoute.centerX() - 6 * scaleCoefficient, + boundsForMiniRoute.centerY() - 9 * scaleCoefficient, paintBlack); } - canvas.drawText(MapUtils.getFormattedDistance(d), boundsForMiniRoute.left + 10, boundsForMiniRoute.bottom - 9, - paintBlack); + canvas.drawText(MapUtils.getFormattedDistance(d), boundsForMiniRoute.left + 10 * scaleCoefficient, + boundsForMiniRoute.bottom - 9 * scaleCoefficient, paintBlack); } } } @@ -346,7 +390,7 @@ public class MapInfoLayer implements OsmandMapLayer { } else { cachedLeftTimeString = DateFormat.format("k:mm aa",toFindTime).toString(); //$NON-NLS-1$ } - boundsForLeftTime.left = - paintBlack.measureText(cachedLeftTimeString) - 10 + boundsForLeftTime.right; + boundsForLeftTime.left = - paintBlack.measureText(cachedLeftTimeString) - 10 * scaleCoefficient + boundsForLeftTime.right; } } else { if(Math.abs(time - cachedLeftTime) > 30){ @@ -354,7 +398,7 @@ public class MapInfoLayer implements OsmandMapLayer { int hours = time / (60 * 60); int minutes = (time / 60) % 60; cachedLeftTimeString = String.format("%d:%02d", hours, minutes); //$NON-NLS-1$ - boundsForLeftTime.left = - paintBlack.measureText(cachedLeftTimeString) - 10 + boundsForLeftTime.right; + boundsForLeftTime.left = - paintBlack.measureText(cachedLeftTimeString) - 10 * scaleCoefficient + boundsForLeftTime.right; } } } @@ -362,20 +406,21 @@ public class MapInfoLayer implements OsmandMapLayer { int w = (int) (boundsForLeftTime.right - boundsForLeftTime.left); boundsForLeftTime.right = view.getWidth(); boundsForLeftTime.left = view.getWidth() - w; - canvas.drawRoundRect(boundsForLeftTime, 3, 3, paintAlphaGray); - canvas.drawRoundRect(boundsForLeftTime, 3, 3, paintBlack); - canvas.drawText(cachedLeftTimeString, boundsForLeftTime.left + 5, boundsForLeftTime.bottom - 9, paintBlack); + canvas.drawRoundRect(boundsForLeftTime, roundCorner, roundCorner, paintAlphaGray); + canvas.drawRoundRect(boundsForLeftTime, roundCorner, roundCorner, paintBlack); + canvas.drawText(cachedLeftTimeString, boundsForLeftTime.left + 5 * scaleCoefficient, boundsForLeftTime.bottom - 9 * scaleCoefficient, paintBlack); } } } + // draw path 96x96 public static void calcTurnPath(Path pathForTurn, TurnType turnType, Matrix transform) { if(turnType == null){ return; } pathForTurn.reset(); - // draw path 96x96 + int c = 48; int w = 16; pathForTurn.moveTo(c, 94); diff --git a/OsmAnd/src/com/osmand/views/OsmandMapTileView.java b/OsmAnd/src/com/osmand/views/OsmandMapTileView.java index 08d21b8978..8578c9babb 100644 --- a/OsmAnd/src/com/osmand/views/OsmandMapTileView.java +++ b/OsmAnd/src/com/osmand/views/OsmandMapTileView.java @@ -20,12 +20,14 @@ import android.graphics.Paint.Style; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.util.FloatMath; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.view.WindowManager; import android.view.GestureDetector.OnDoubleTapListener; import android.view.GestureDetector.OnGestureListener; import android.view.SurfaceHolder.Callback; @@ -49,8 +51,6 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall public static final int OVERZOOM_IN = 2; protected final int emptyTileDivisor = 16; - protected final int timeForDraggingAnimation = 300; - protected final int minimumDistanceForDraggingAnimation = 40; public interface OnTrackBallListener{ public boolean onTrackBallEvent(MotionEvent e); @@ -113,6 +113,8 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall Paint paintWhiteFill; Paint paintCenter; Paint paintBitmap; + + private DisplayMetrics dm; public OsmandMapTileView(Context context, AttributeSet attrs) { @@ -159,6 +161,10 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall gestureDetector = new GestureDetector(getContext(), this); multiTouchSupport = new MultiTouchSupport(getContext(), this); gestureDetector.setOnDoubleTapListener(this); + + WindowManager mgr = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); + dm = new DisplayMetrics(); + mgr.getDefaultDisplay().getMetrics(dm); } @@ -356,8 +362,8 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall int w = getCenterPointX(); int h = getCenterPointY(); if (showMapPosition) { - canvas.drawCircle(w, h, 3, paintCenter); - canvas.drawCircle(w, h, 7, paintCenter); + canvas.drawCircle(w, h, 3 * dm.density, paintCenter); + canvas.drawCircle(w, h, 7 * dm.density, paintCenter); } canvas.restore(); for (OsmandMapLayer layer : layers) { @@ -756,7 +762,7 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - if(Math.abs(e1.getX() - e2.getX()) + Math.abs(e1.getX() - e2.getX()) > 50){ + if(Math.abs(e1.getX() - e2.getX()) + Math.abs(e1.getX() - e2.getX()) > 50 * dm.density){ animatedDraggingThread.startDragging(Math.abs(velocityX/1000), Math.abs(velocityY/1000), e1.getX(), e1.getY(), e2.getX(), e2.getY()); } else { onScroll(e1, e2, e1.getX() - e2.getX(), e1.getY() - e2.getY());