Merge with 6f18dfaa4b33c178829a3cdfa374f0ac6a55d5c7

This commit is contained in:
bartn
2010-12-28 11:17:43 -08:00
parent a19097de2b
commit e89c549706
3 changed files with 125 additions and 53 deletions
+13 -5
View File
@@ -24,13 +24,21 @@ limitations under the License.
<color name="green">#FF00AA00</color> <color name="green">#FF00AA00</color>
<color name="lightblue">#FF00FFFF</color> <color name="lightblue">#FF00FFFF</color>
<color name="opaque_shadow">#70000000</color> <color name="opaque_shadow">#70000000</color>
<color name="purple">#FF401465</color>
<color name="purple_transparent">#40401465</color>
<color name="red">#FFFF0000</color> <color name="red">#FFFF0000</color>
<color name="red_transparent">#40FF0000</color>
<color name="stat_label_background">#FFF0F0F0</color> <color name="stat_label_background">#FFF0F0F0</color>
<color name="stat_label_text">#FF0F0F0F</color> <color name="stat_label_text">#FF0F0F0F</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="yellow">#FFF8FF00</color>
<color name="yellow_transparent">#40F8FF00</color> <!-- Chart colors by series. -->
<!-- Purple and a transparent purple -->
<color name="heartrate_border">#FF401465</color>
<color name="heartrate_fill">#40401465</color>
<!-- Pink and a transparent pink -->
<color name="cadence_border">#FFF128F3</color>
<color name="cadence_fill">#40F128F3</color>
<!-- red and a transparent red -->
<color name="power_border">#FFFF0000</color>
<color name="power_fill">#40FF0000</color>
</resources> </resources>
@@ -21,6 +21,7 @@ import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Path; import android.graphics.Path;
import android.graphics.Paint.Style;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@@ -36,6 +37,7 @@ public class ChartValueSeries {
private final Path path = new Path(); private final Path path = new Path();
private final Paint fillPaint; private final Paint fillPaint;
private final Paint strokePaint; private final Paint strokePaint;
private final Paint labelPaint;
private final int rounding; private final int rounding;
private String title; private String title;
@@ -47,6 +49,42 @@ public class ChartValueSeries {
private double spread = 0; private double spread = 0;
private boolean enabled = true; 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. * Constructs a new chart value series.
* *
@@ -64,6 +102,7 @@ public class ChartValueSeries {
int titleId) { int titleId) {
this.format = new DecimalFormat(formatString); this.format = new DecimalFormat(formatString);
this.fillPaint = fill; this.fillPaint = fill;
this.labelPaint = fill;
this.strokePaint = stroke; this.strokePaint = stroke;
this.rounding = rounding; this.rounding = rounding;
this.title = context.getString(titleId); this.title = context.getString(titleId);
@@ -194,6 +233,10 @@ public class ChartValueSeries {
: strokePaint; : strokePaint;
} }
public Paint getLabelPaint() {
return labelPaint;
}
/** /**
* @return The title of the series * @return The title of the series
*/ */
@@ -66,8 +66,27 @@ public class ChartView extends View {
* Borders, margins, dimensions (in pixels): * Borders, margins, dimensions (in pixels):
*/ */
private int leftBorder = -1; private int leftBorder = -1;
/**
* Unscaled top border of the chart.
*/
private static final int TOP_BORDER = 15; 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; private static final int RIGHT_BORDER = 17;
/** Space to leave for drawing the unit labels */ /** Space to leave for drawing the unit labels */
private static final int UNIT_BORDER = 15; private static final int UNIT_BORDER = 15;
@@ -174,45 +193,44 @@ public class ChartView extends View {
public void setUpChartValueSeries(Context context) { public void setUpChartValueSeries(Context context) {
series = new ChartValueSeries[NUM_SERIES]; 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 // Create the value series
series[ELEVATION_SERIES] = series[ELEVATION_SERIES] =
new ChartValueSeries(context, new ChartValueSeries(context,
"###,###", "###,###",
fillPaint, R.color.green,
null, -1,
100, 100,
R.string.elevation); R.string.elevation);
series[SPEED_SERIES] = getSeries(context, R.color.blue_transparent, series[SPEED_SERIES] =
R.color.blue, "###,###.0", R.string.speed); new ChartValueSeries(context,
series[POWER_SERIES] = getSeries(context, R.color.red_transparent, "###,###.0",
R.color.red, "###,###", R.string.power); 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[POWER_SERIES].setAbsoluteMax(1500);
series[CADENCE_SERIES] = getSeries(context, R.color.purple_transparent, series[CADENCE_SERIES] =
R.color.purple, "###,###", R.string.cadence); new ChartValueSeries(context,
series[HEART_RATE_SERIES] = getSeries(context, R.color.yellow_transparent, "###,###",
R.color.yellow, "###,###", R.string.heart_rate); R.color.cadence_fill,
} R.color.cadence_border,
5,
private ChartValueSeries getSeries(Context context, R.string.cadence);
int fillColor, int strokeColor, String format, int seriesName) { series[HEART_RATE_SERIES] =
Paint fillPaint = new Paint(); new ChartValueSeries(context,
fillPaint.setStyle(Style.FILL); "###,###",
fillPaint.setColor(context.getResources().getColor(fillColor)); R.color.heartrate_fill,
fillPaint.setAntiAlias(true); R.color.heartrate_border,
5,
Paint strokePaint = new Paint(); R.string.heart_rate);
strokePaint.setStyle(Style.STROKE);
strokePaint.setColor(context.getResources().getColor(strokeColor));
strokePaint.setAntiAlias(true);
return new ChartValueSeries(context, format, fillPaint, strokePaint, 5,
seriesName);
} }
public void clearWaypoints() { public void clearWaypoints() {
@@ -529,7 +547,7 @@ public class ChartView extends View {
w = c.getWidth(); w = c.getWidth();
h = c.getHeight(); h = c.getHeight();
effectiveWidth = Math.max(0, w - leftBorder - RIGHT_BORDER); 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(); setupPath();
} }
c.save(); c.save();
@@ -558,7 +576,7 @@ public class ChartView extends View {
c.save(); c.save();
final float x = getWaypointX(waypoint); 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); c.translate(x - (markerWidth / 2), markerHeight);
if (waypoints.get(i).getType() == Waypoint.TYPE_STATISTICS) { if (waypoints.get(i).getType() == Waypoint.TYPE_STATISTICS) {
statsMarker.draw(c); statsMarker.draw(c);
@@ -601,7 +619,7 @@ public class ChartView extends View {
for (ChartValueSeries cvs : series) { for (ChartValueSeries cvs : series) {
if (cvs.isEnabled() && cvs.hasData()) { if (cvs.isEnabled() && cvs.hasData()) {
int y = (int) (w * zoomLevel * ((double) (++j) / sections)); 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. // Close the path.
int yCorner = TOP_BORDER + effectiveHeight; int yCorner = topBorder + effectiveHeight;
int xCorner = getX(data.get(0)[0]); int xCorner = getX(data.get(0)[0]);
int min = series.length; int min = series.length;
for (int j = 0; j < min; j++) { for (int j = 0; j < min; j++) {
@@ -682,7 +700,10 @@ public class ChartView extends View {
} }
leftBorder = 4 + 7 * maxLength; leftBorder = 4 + 7 * maxLength;
effectiveWidth = w - leftBorder - RIGHT_BORDER; 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) { private int getX(double distance) {
@@ -690,7 +711,7 @@ public class ChartView extends View {
} }
private int getY(ChartValueSeries cvs, double y) { private int getY(ChartValueSeries cvs, double y) {
return TOP_BORDER + effectiveHeight return topBorder + effectiveHeight
- (int) ((y - cvs.getMin()) * effectiveHeight / cvs.getSpread()); - (int) ((y - cvs.getMin()) * effectiveHeight / cvs.getSpread());
} }
@@ -747,7 +768,7 @@ public class ChartView extends View {
: StringUtils.formatTime((long) x); : StringUtils.formatTime((long) x);
c.drawText(s, c.drawText(s,
getX(x), getX(x),
effectiveHeight + UNIT_BORDER + TOP_BORDER, effectiveHeight + UNIT_BORDER + topBorder,
labelPaint); labelPaint);
} }
@@ -763,19 +784,19 @@ public class ChartView extends View {
if (yLabelMask[slot]) { if (yLabelMask[slot]) {
desiredY = ++slot * FONT_HEIGHT; desiredY = ++slot * FONT_HEIGHT;
} }
desiredY = TOP_BORDER + effectiveHeight + 5 - desiredY; desiredY = topBorder + effectiveHeight + 5 - desiredY;
if (slot < yLabelMask.length) { if (slot < yLabelMask.length) {
yLabelMask[slot] = true; yLabelMask[slot] = true;
} }
c.drawText(cvs.getFormat().format(y), c.drawText(cvs.getFormat().format(y),
2, desiredY, 2, desiredY,
cvs.getPaint()); cvs.getLabelPaint());
} }
private void drawXAxis(Canvas canvas) { private void drawXAxis(Canvas canvas) {
float rightEdge = getX(maxX); float rightEdge = getX(maxX);
canvas.drawLine(leftBorder, effectiveHeight + TOP_BORDER, rightEdge, canvas.drawLine(leftBorder, effectiveHeight + topBorder, rightEdge,
effectiveHeight + TOP_BORDER, borderPaint); effectiveHeight + topBorder, borderPaint);
Context c = getContext(); Context c = getContext();
String s = String s =
(mode == Mode.BY_DISTANCE) (mode == Mode.BY_DISTANCE)
@@ -783,16 +804,16 @@ public class ChartView extends View {
: c.getString(R.string.mile)) : (c.getString(R.string.min)); : c.getString(R.string.mile)) : (c.getString(R.string.min));
canvas.drawText(s, canvas.drawText(s,
rightEdge, rightEdge,
effectiveHeight + .2f * UNIT_BORDER + TOP_BORDER, effectiveHeight + .2f * UNIT_BORDER + topBorder,
labelPaint); labelPaint);
} }
private void drawYAxis(Canvas canvas) { private void drawYAxis(Canvas canvas) {
canvas.drawLine(leftBorder, UNIT_BORDER + TOP_BORDER, canvas.drawLine(leftBorder, UNIT_BORDER + topBorder,
leftBorder, effectiveHeight + TOP_BORDER, leftBorder, effectiveHeight + topBorder,
borderPaint); borderPaint);
canvas.drawRect(0, 0, canvas.drawRect(0, 0,
leftBorder - 1, effectiveHeight + TOP_BORDER + 1, leftBorder - 1, effectiveHeight + topBorder + 1,
clearPaint); clearPaint);
Context c = getContext(); Context c = getContext();
// TODO: This should really show units for all series. // 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.meter)
: c.getString(R.string.feet); : c.getString(R.string.feet);
canvas.drawText(s, leftBorder - UNIT_BORDER * .2f, canvas.drawText(s, leftBorder - UNIT_BORDER * .2f,
UNIT_BORDER * .8f + TOP_BORDER, labelPaint); UNIT_BORDER * .8f + topBorder, labelPaint);
} }
private synchronized void drawGrid(Canvas c) { private synchronized void drawGrid(Canvas c) {