diff --git a/MyTracks/res/values/colors.xml b/MyTracks/res/values/colors.xml index 3ce80b119..51f287256 100644 --- a/MyTracks/res/values/colors.xml +++ b/MyTracks/res/values/colors.xml @@ -24,13 +24,21 @@ limitations under the License. #FF00AA00 #FF00FFFF #70000000 - #FF401465 - #40401465 #FFFF0000 - #40FF0000 #FFF0F0F0 #FF0F0F0F #FFFFFFFF - #FFF8FF00 - #40F8FF00 + + + + #FF401465 + #40401465 + + + #FFF128F3 + #40F128F3 + + + #FFFF0000 + #40FF0000 diff --git a/MyTracks/src/com/google/android/apps/mytracks/ChartValueSeries.java b/MyTracks/src/com/google/android/apps/mytracks/ChartValueSeries.java index acf61ab16..36bcdd4e0 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ChartValueSeries.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ChartValueSeries.java @@ -21,6 +21,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; +import android.graphics.Paint.Style; import java.text.DecimalFormat; @@ -36,6 +37,7 @@ public class ChartValueSeries { private final Path path = new Path(); private final Paint fillPaint; private final Paint strokePaint; + private final Paint labelPaint; private final int rounding; private String title; @@ -47,6 +49,42 @@ public class ChartValueSeries { private double spread = 0; private boolean enabled = true; + /** + * Constructs a new chart value series. + * + * @param context The context for the chart + * @param formatString The format of the decimal format for this series + * @param fill The paint for filling the chart + * @param stroke The paint for stroking the outside the chart, optional + * @param rounding The factor to round the values by + */ + public ChartValueSeries(Context context, + String formatString, + int fillColor, + int strokeColor, + int rounding, + int titleId) { + this.format = new DecimalFormat(formatString); + fillPaint = new Paint(); + fillPaint.setStyle(Style.FILL); + fillPaint.setColor(context.getResources().getColor(fillColor)); + fillPaint.setAntiAlias(true); + if (strokeColor != -1) { + strokePaint = new Paint(); + strokePaint.setStyle(Style.STROKE); + strokePaint.setColor(context.getResources().getColor(strokeColor)); + strokePaint.setAntiAlias(true); + // Make a copy of the stroke paint with the default thickness. + labelPaint = new Paint(strokePaint); + strokePaint.setStrokeWidth(2f); + } else { + strokePaint = null; + labelPaint = fillPaint; + } + this.rounding = rounding; + this.title = context.getString(titleId); + } + /** * Constructs a new chart value series. * @@ -64,6 +102,7 @@ public class ChartValueSeries { int titleId) { this.format = new DecimalFormat(formatString); this.fillPaint = fill; + this.labelPaint = fill; this.strokePaint = stroke; this.rounding = rounding; this.title = context.getString(titleId); @@ -194,6 +233,10 @@ public class ChartValueSeries { : strokePaint; } + public Paint getLabelPaint() { + return labelPaint; + } + /** * @return The title of the series */ diff --git a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java index 06cc848bf..24888536a 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ChartView.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ChartView.java @@ -66,8 +66,27 @@ public class ChartView extends View { * Borders, margins, dimensions (in pixels): */ private int leftBorder = -1; + + /** + * Unscaled top border of the chart. + */ private static final int TOP_BORDER = 15; - private static final int BOTTOM_BORDER = 135; + + /** + * Device scaled top border of the chart. + */ + private int topBorder; + + /** + * Unscaled bottom border of the chart. + */ + private static final float BOTTOM_BORDER = 100; + + /** + * Device scaled bottom border of the chart. + */ + private int bottomBorder; + private static final int RIGHT_BORDER = 17; /** Space to leave for drawing the unit labels */ private static final int UNIT_BORDER = 15; @@ -174,45 +193,44 @@ public class ChartView extends View { public void setUpChartValueSeries(Context context) { series = new ChartValueSeries[NUM_SERIES]; - // Create the paints - Paint fillPaint = new Paint(); - fillPaint.setStyle(Style.FILL); - fillPaint.setColor(context.getResources().getColor(R.color.green)); - fillPaint.setAntiAlias(true); - // Create the value series series[ELEVATION_SERIES] = new ChartValueSeries(context, "###,###", - fillPaint, - null, + R.color.green, + -1, 100, R.string.elevation); - series[SPEED_SERIES] = getSeries(context, R.color.blue_transparent, - R.color.blue, "###,###.0", R.string.speed); - series[POWER_SERIES] = getSeries(context, R.color.red_transparent, - R.color.red, "###,###", R.string.power); + series[SPEED_SERIES] = + new ChartValueSeries(context, + "###,###.0", + R.color.blue_transparent, + R.color.blue, + 5, + R.string.speed); + series[POWER_SERIES] = + new ChartValueSeries(context, + "###,###", + R.color.power_fill, + R.color.power_border, + 5, + R.string.power); series[POWER_SERIES].setAbsoluteMax(1500); - series[CADENCE_SERIES] = getSeries(context, R.color.purple_transparent, - R.color.purple, "###,###", R.string.cadence); - series[HEART_RATE_SERIES] = getSeries(context, R.color.yellow_transparent, - R.color.yellow, "###,###", R.string.heart_rate); - } - - private ChartValueSeries getSeries(Context context, - int fillColor, int strokeColor, String format, int seriesName) { - Paint fillPaint = new Paint(); - fillPaint.setStyle(Style.FILL); - fillPaint.setColor(context.getResources().getColor(fillColor)); - fillPaint.setAntiAlias(true); - - Paint strokePaint = new Paint(); - strokePaint.setStyle(Style.STROKE); - strokePaint.setColor(context.getResources().getColor(strokeColor)); - strokePaint.setAntiAlias(true); - return new ChartValueSeries(context, format, fillPaint, strokePaint, 5, - seriesName); + series[CADENCE_SERIES] = + new ChartValueSeries(context, + "###,###", + R.color.cadence_fill, + R.color.cadence_border, + 5, + R.string.cadence); + series[HEART_RATE_SERIES] = + new ChartValueSeries(context, + "###,###", + R.color.heartrate_fill, + R.color.heartrate_border, + 5, + R.string.heart_rate); } public void clearWaypoints() { @@ -529,7 +547,7 @@ public class ChartView extends View { w = c.getWidth(); h = c.getHeight(); effectiveWidth = Math.max(0, w - leftBorder - RIGHT_BORDER); - effectiveHeight = Math.max(0, h - TOP_BORDER - BOTTOM_BORDER); + effectiveHeight = Math.max(0, h - topBorder - bottomBorder); setupPath(); } c.save(); @@ -558,7 +576,7 @@ public class ChartView extends View { c.save(); final float x = getWaypointX(waypoint); - c.drawLine(x, h - BOTTOM_BORDER, x, TOP_BORDER, gridPaint); + c.drawLine(x, h - bottomBorder, x, topBorder, gridPaint); c.translate(x - (markerWidth / 2), markerHeight); if (waypoints.get(i).getType() == Waypoint.TYPE_STATISTICS) { statsMarker.draw(c); @@ -601,7 +619,7 @@ public class ChartView extends View { for (ChartValueSeries cvs : series) { if (cvs.isEnabled() && cvs.hasData()) { int y = (int) (w * zoomLevel * ((double) (++j) / sections)); - c.drawText(cvs.getTitle(), y, TOP_BORDER, cvs.getPaint()); + c.drawText(cvs.getTitle(), y, topBorder, cvs.getLabelPaint()); } } } @@ -631,7 +649,7 @@ public class ChartView extends View { } // Close the path. - int yCorner = TOP_BORDER + effectiveHeight; + int yCorner = topBorder + effectiveHeight; int xCorner = getX(data.get(0)[0]); int min = series.length; for (int j = 0; j < min; j++) { @@ -682,7 +700,10 @@ public class ChartView extends View { } leftBorder = 4 + 7 * maxLength; effectiveWidth = w - leftBorder - RIGHT_BORDER; - effectiveHeight = h - TOP_BORDER - BOTTOM_BORDER; + float density = getContext().getResources().getDisplayMetrics().density; + bottomBorder = (int) (density * BOTTOM_BORDER); + topBorder = (int) (density * TOP_BORDER); + effectiveHeight = h - topBorder - bottomBorder; } private int getX(double distance) { @@ -690,7 +711,7 @@ public class ChartView extends View { } private int getY(ChartValueSeries cvs, double y) { - return TOP_BORDER + effectiveHeight + return topBorder + effectiveHeight - (int) ((y - cvs.getMin()) * effectiveHeight / cvs.getSpread()); } @@ -747,7 +768,7 @@ public class ChartView extends View { : StringUtils.formatTime((long) x); c.drawText(s, getX(x), - effectiveHeight + UNIT_BORDER + TOP_BORDER, + effectiveHeight + UNIT_BORDER + topBorder, labelPaint); } @@ -763,19 +784,19 @@ public class ChartView extends View { if (yLabelMask[slot]) { desiredY = ++slot * FONT_HEIGHT; } - desiredY = TOP_BORDER + effectiveHeight + 5 - desiredY; + desiredY = topBorder + effectiveHeight + 5 - desiredY; if (slot < yLabelMask.length) { yLabelMask[slot] = true; } c.drawText(cvs.getFormat().format(y), 2, desiredY, - cvs.getPaint()); + cvs.getLabelPaint()); } private void drawXAxis(Canvas canvas) { float rightEdge = getX(maxX); - canvas.drawLine(leftBorder, effectiveHeight + TOP_BORDER, rightEdge, - effectiveHeight + TOP_BORDER, borderPaint); + canvas.drawLine(leftBorder, effectiveHeight + topBorder, rightEdge, + effectiveHeight + topBorder, borderPaint); Context c = getContext(); String s = (mode == Mode.BY_DISTANCE) @@ -783,16 +804,16 @@ public class ChartView extends View { : c.getString(R.string.mile)) : (c.getString(R.string.min)); canvas.drawText(s, rightEdge, - effectiveHeight + .2f * UNIT_BORDER + TOP_BORDER, + effectiveHeight + .2f * UNIT_BORDER + topBorder, labelPaint); } private void drawYAxis(Canvas canvas) { - canvas.drawLine(leftBorder, UNIT_BORDER + TOP_BORDER, - leftBorder, effectiveHeight + TOP_BORDER, + canvas.drawLine(leftBorder, UNIT_BORDER + topBorder, + leftBorder, effectiveHeight + topBorder, borderPaint); canvas.drawRect(0, 0, - leftBorder - 1, effectiveHeight + TOP_BORDER + 1, + leftBorder - 1, effectiveHeight + topBorder + 1, clearPaint); Context c = getContext(); // TODO: This should really show units for all series. @@ -800,7 +821,7 @@ public class ChartView extends View { ? c.getString(R.string.meter) : c.getString(R.string.feet); canvas.drawText(s, leftBorder - UNIT_BORDER * .2f, - UNIT_BORDER * .8f + TOP_BORDER, labelPaint); + UNIT_BORDER * .8f + topBorder, labelPaint); } private synchronized void drawGrid(Canvas c) {