package lecho.lib.hellocharts.samples;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import lecho.lib.hellocharts.formatter.SimpleAxisValueFormatter;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.Viewport;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.LineChartView;
public class SpeedChartActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tempo_chart);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
}
}
public static class PlaceholderFragment extends Fragment {
private LineChartView chart;
private LineChartData data;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_tempo_chart, container, false);
chart = (LineChartView) rootView.findViewById(R.id.chart);
generateSpeedData();
return rootView;
}
private void generateSpeedData() {
// I got speed in range (0-55) and height in meters in range(200 - 300). I want this chart to display both
// information. Differences between speed and height values are large and chart doesn't look good so I need
// to modify height values to be in range of speed values.
float speedRange = 55;
float minHeight = 200;
float maxHeight = 300;
float scale = speedRange / maxHeight;
float sub = (minHeight * scale) / 2;
int numValues = 52;
Line line;
List<PointValue> values;
List<Line> lines = new ArrayList<Line>();
// Height line, add it as first line to be drawn in the background.
values = new ArrayList<PointValue>();
for (int i = 0; i < numValues; ++i) {
// Some random height values, add +200 to make line a little more natural
float rawHeight = (float) (Math.random() * 100 + 200);
float normalizedHeight = rawHeight * scale - sub;
values.add(new PointValue(i, normalizedHeight));
}
line = new Line(values);
line.setColor(Color.GRAY);
line.setHasPoints(false);
line.setFilled(true);
line.setStrokeWidth(1);
lines.add(line);
// Speed line
values = new ArrayList<PointValue>();
for (int i = 0; i < numValues; ++i) {
// Some random speed values, add +20 to make line a little more natural.
values.add(new PointValue(i, (float) Math.random() * 30 + 20));
}
line = new Line(values);
line.setColor(ChartUtils.COLOR_GREEN);
line.setHasPoints(false);
line.setStrokeWidth(3);
lines.add(line);
// Data and axes
data = new LineChartData(lines);
// Distance axis(bottom X) with formatter that will ad [km] to values, remember to modify max label charts
// value.
Axis distanceAxis = new Axis();
distanceAxis.setName("Distance");
distanceAxis.setTextColor(ChartUtils.COLOR_ORANGE);
distanceAxis.setMaxLabelChars(4);
distanceAxis.setFormatter(new SimpleAxisValueFormatter().setAppendedText("km".toCharArray()));
distanceAxis.setHasLines(true);
distanceAxis.setInside(true);
data.setAxisXBottom(distanceAxis);
// Speed axis
data.setAxisYLeft(new Axis().setName("Speed [km/h]").setHasLines(true).setMaxLabelChars(3)
.setTextColor(ChartUtils.COLOR_RED).setInside(true));
// Height axis, this axis need custom formatter that will translate values back to real height values.
data.setAxisYRight(new Axis().setName("Height [m]").setMaxLabelChars(3).setTextColor(ChartUtils.COLOR_BLUE)
.setFormatter(new HeightValueFormatter(scale, sub, 0)).setInside(true));
// Set data
chart.setLineChartData(data);
// Important: adjust viewport, you could skip this step but in this case it will looks better with custom
// viewport. Set
// viewport with Y range 0-55;
Viewport v = chart.getMaximumViewport();
v.set(v.left, speedRange, v.right, 0);
chart.setMaximumViewport(v);
chart.setCurrentViewport(v);
}
/**
* Recalculated height values to display on axis.
*/
private static class HeightValueFormatter extends SimpleAxisValueFormatter {
private float scale;
private float sub;
private int decimalDigits;
public HeightValueFormatter(float scale, float sub, int decimalDigits) {
this.scale = scale;
this.sub = sub;
this.decimalDigits = decimalDigits;
}
@Override
public int formatValueForAutoGeneratedAxis(char[] formattedValue, float value, int autoDecimalDigits) {
float scaledValue = (value + sub) / scale;
return super.formatValueForAutoGeneratedAxis(formattedValue, scaledValue, this.decimalDigits);
}
}
}
}