Fix turn lanes drawing

This commit is contained in:
Alexey Kulish 2017-11-11 19:18:43 +03:00
parent 35e80227e2
commit 618fa286bd
2 changed files with 50 additions and 25 deletions

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<dimen name="widget_turn_lane_size">36dp</dimen> <dimen name="widget_turn_lane_size">36dp</dimen>
<dimen name="widget_turn_lane_border">3dp</dimen> <dimen name="widget_turn_lane_border">6dp</dimen>
<dimen name="widget_turn_lane_margin">2dp</dimen> <dimen name="widget_turn_lane_margin">2dp</dimen>
<dimen name="widget_turn_lane_min_width">16dp</dimen> <dimen name="widget_turn_lane_min_delta">18dp</dimen>
<dimen name="acceptable_touch_radius">48dp</dimen> <dimen name="acceptable_touch_radius">48dp</dimen>

View file

@ -11,8 +11,6 @@ import android.graphics.ColorFilter;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Paint.Style; import android.graphics.Paint.Style;
import android.graphics.Path; import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.GeomagneticField; import android.hardware.GeomagneticField;
@ -57,6 +55,7 @@ import net.osmand.router.RouteResultPreparation;
import net.osmand.router.TurnType; import net.osmand.router.TurnType;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -849,24 +848,27 @@ public class RouteInfoWidgetsFactory {
private float scaleCoefficient; private float scaleCoefficient;
private int height; private int height;
private int width; private int width;
private float delta;
private float laneHalfSize;
private static final float miniCoeff = 2f; private static final float miniCoeff = 2f;
private final boolean leftSide; private final boolean leftSide;
private int imgMinWidth; private int imgMinDelta;
private int imgMargin; private int imgMargin;
LanesDrawable(MapActivity ctx, float scaleCoefficent) { LanesDrawable(MapActivity ctx, float scaleCoefficent) {
this.ctx = ctx; this.ctx = ctx;
OsmandSettings settings = ctx.getMyApplication().getSettings(); OsmandSettings settings = ctx.getMyApplication().getSettings();
leftSide = settings.DRIVING_REGION.get().leftHandDriving; leftSide = settings.DRIVING_REGION.get().leftHandDriving;
imgMinWidth = ctx.getResources().getDimensionPixelSize(R.dimen.widget_turn_lane_min_width); imgMinDelta = ctx.getResources().getDimensionPixelSize(R.dimen.widget_turn_lane_min_delta);
imgMargin = ctx.getResources().getDimensionPixelSize(R.dimen.widget_turn_lane_margin); imgMargin = ctx.getResources().getDimensionPixelSize(R.dimen.widget_turn_lane_margin);
laneHalfSize = ctx.getResources().getDimensionPixelSize(R.dimen.widget_turn_lane_size) / 2;
this.scaleCoefficient = scaleCoefficent; this.scaleCoefficient = scaleCoefficent;
paintBlack = new Paint(Paint.ANTI_ALIAS_FLAG); paintBlack = new Paint(Paint.ANTI_ALIAS_FLAG);
paintBlack.setStyle(Style.STROKE); paintBlack.setStyle(Style.STROKE);
paintBlack.setColor(Color.BLACK); paintBlack.setColor(Color.BLACK);
paintBlack.setStrokeWidth(1.5f); paintBlack.setStrokeWidth(3.5f);
paintRouteDirection = new Paint(Paint.ANTI_ALIAS_FLAG); paintRouteDirection = new Paint(Paint.ANTI_ALIAS_FLAG);
paintRouteDirection.setStyle(Style.FILL); paintRouteDirection.setStyle(Style.FILL);
@ -880,8 +882,10 @@ public class RouteInfoWidgetsFactory {
void updateBounds() { void updateBounds() {
float w = 0; float w = 0;
float h = 0; float h = 0;
float delta = imgMinDelta;
float coef = scaleCoefficient / miniCoeff; float coef = scaleCoefficient / miniCoeff;
if (lanes != null) { if (lanes != null) {
List<RectF> boundsList = new ArrayList<>(lanes.length);
for (int i = 0; i < lanes.length; i++) { for (int i = 0; i < lanes.length; i++) {
int turnType = TurnType.getPrimaryTurn(lanes[i]); int turnType = TurnType.getPrimaryTurn(lanes[i]);
int secondTurnType = TurnType.getSecondaryTurn(lanes[i]); int secondTurnType = TurnType.getSecondaryTurn(lanes[i]);
@ -933,16 +937,28 @@ public class RouteInfoWidgetsFactory {
} }
if (imgBounds.right > 0) if (imgBounds.right > 0)
{ {
if (imgBounds.width() < imgMinWidth) { boundsList.add(imgBounds);
imgBounds.inset(-(imgMinWidth - imgBounds.width()) / 2.f, 0);
}
w += imgBounds.width() + (i < lanes.length - 1 ? imgMargin * 2 : 0);
float imageHeight = imgBounds.bottom; float imageHeight = imgBounds.bottom;
if (imageHeight > h) if (imageHeight > h)
h = imageHeight; h = imageHeight;
} }
} }
if (boundsList.size() > 1) {
for (int i = 1; i < boundsList.size(); i++) {
RectF b1 = boundsList.get(i - 1);
RectF b2 = boundsList.get(i);
float d = b1.right + imgMargin * 2 - b2.left;
if (delta < d)
delta = d;
}
RectF b1 = boundsList.get(0);
RectF b2 = boundsList.get(boundsList.size() - 1);
w = -b1.left + (boundsList.size() - 1) * delta + b2.right;
} else if (boundsList.size() > 0) {
RectF b1 = boundsList.get(0);
w = b1.width();
}
if (w > 0) { if (w > 0) {
w += 4; w += 4;
} }
@ -950,8 +966,9 @@ public class RouteInfoWidgetsFactory {
h += 4; h += 4;
} }
} }
width = (int) w; this.width = (int) w;
height = (int) h; this.height = (int) h;
this.delta = delta;
} }
@Override @Override
@ -972,6 +989,7 @@ public class RouteInfoWidgetsFactory {
//to change color immediately when needed //to change color immediately when needed
if (lanes != null && lanes.length > 0) { if (lanes != null && lanes.length > 0) {
float coef = scaleCoefficient / miniCoeff;
canvas.save(); canvas.save();
// canvas.translate((int) (16 * scaleCoefficient), 0); // canvas.translate((int) (16 * scaleCoefficient), 0);
for (int i = 0; i < lanes.length; i++) { for (int i = 0; i < lanes.length; i++) {
@ -990,7 +1008,6 @@ public class RouteInfoWidgetsFactory {
Path secondTurnPath = null; Path secondTurnPath = null;
Path firstTurnPath = null; Path firstTurnPath = null;
float coef = scaleCoefficient / miniCoeff;
if (thirdTurnType > 0) { if (thirdTurnType > 0) {
Path p = TurnPathHelper.getPathFromTurnType(ctx.getResources(), pathsCache, turnType, Path p = TurnPathHelper.getPathFromTurnType(ctx.getResources(), pathsCache, turnType,
secondTurnType, thirdTurnType, TurnPathHelper.THIRD_TURN, coef, leftSide, true); secondTurnType, thirdTurnType, TurnPathHelper.THIRD_TURN, coef, leftSide, true);
@ -1039,31 +1056,39 @@ public class RouteInfoWidgetsFactory {
} }
if (firstTurnPath != null || secondTurnPath != null || thirdTurnPath != null) { if (firstTurnPath != null || secondTurnPath != null || thirdTurnPath != null) {
if (imgBounds.width() < imgMinWidth) {
imgBounds.inset(-(imgMinWidth - imgBounds.width()) / 2.f, 0);
}
if (i == 0) { if (i == 0) {
imgBounds.set(imgBounds.left - 2, imgBounds.top, imgBounds.right + imgMargin, imgBounds.bottom); imgBounds.set(imgBounds.left - 2, imgBounds.top, imgBounds.right + 2, imgBounds.bottom);
canvas.translate(-imgBounds.left, 0);
} else { } else {
imgBounds.inset(-imgMargin, 0); canvas.translate(-laneHalfSize, 0);
} }
canvas.translate(-imgBounds.left, 0); // 1st pass
if (thirdTurnPath != null) { if (thirdTurnPath != null) {
canvas.drawPath(thirdTurnPath, paintSecondTurn); //canvas.drawPath(thirdTurnPath, paintSecondTurn);
canvas.drawPath(thirdTurnPath, paintBlack); canvas.drawPath(thirdTurnPath, paintBlack);
} }
if (secondTurnPath != null) { if (secondTurnPath != null) {
canvas.drawPath(secondTurnPath, paintSecondTurn); //canvas.drawPath(secondTurnPath, paintSecondTurn);
canvas.drawPath(secondTurnPath, paintBlack); canvas.drawPath(secondTurnPath, paintBlack);
} }
if (firstTurnPath != null) { if (firstTurnPath != null) {
canvas.drawPath(firstTurnPath, paintRouteDirection); //canvas.drawPath(firstTurnPath, paintRouteDirection);
canvas.drawPath(firstTurnPath, paintBlack); canvas.drawPath(firstTurnPath, paintBlack);
} }
canvas.translate(imgBounds.right, 0); // 2nd pass
if (thirdTurnPath != null) {
canvas.drawPath(thirdTurnPath, paintSecondTurn);
}
if (secondTurnPath != null) {
canvas.drawPath(secondTurnPath, paintSecondTurn);
}
if (firstTurnPath != null) {
canvas.drawPath(firstTurnPath, paintRouteDirection);
}
canvas.translate(laneHalfSize + delta, 0);
} }
} }
canvas.restore(); canvas.restore();