2 * Copyright (C) 2009 - 2012 SC 4ViewSoft SRL
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
16 package org.achartengine.chart;
\r
18 import org.achartengine.model.XYMultipleSeriesDataset;
\r
19 import org.achartengine.renderer.SimpleSeriesRenderer;
\r
20 import org.achartengine.renderer.XYMultipleSeriesRenderer;
\r
21 import org.achartengine.renderer.XYSeriesRenderer;
\r
23 import android.graphics.Canvas;
\r
24 import android.graphics.Paint;
\r
25 import android.graphics.Paint.Style;
\r
26 import android.graphics.RectF;
\r
29 * The line chart rendering class.
\r
31 public class LineChart extends XYChart {
\r
32 /** The constant to identify this chart type. */
\r
33 public static final String TYPE = "Line";
\r
34 /** The legend shape width. */
\r
35 private static final int SHAPE_WIDTH = 30;
\r
36 /** The scatter chart to be used to draw the data points. */
\r
37 private ScatterChart pointsChart;
\r
43 * Builds a new line chart instance.
\r
45 * @param dataset the multiple series dataset
\r
46 * @param renderer the multiple series renderer
\r
48 public LineChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) {
\r
49 super(dataset, renderer);
\r
50 pointsChart = new ScatterChart(dataset, renderer);
\r
54 * Sets the series and the renderer.
\r
56 * @param dataset the series dataset
\r
57 * @param renderer the series renderer
\r
59 protected void setDatasetRenderer(XYMultipleSeriesDataset dataset,
\r
60 XYMultipleSeriesRenderer renderer) {
\r
61 super.setDatasetRenderer(dataset, renderer);
\r
62 pointsChart = new ScatterChart(dataset, renderer);
\r
66 * The graphical representation of a series.
\r
68 * @param canvas the canvas to paint to
\r
69 * @param paint the paint to be used for drawing
\r
70 * @param points the array of points to be used for drawing the series
\r
71 * @param seriesRenderer the series renderer
\r
72 * @param yAxisValue the minimum value of the y axis
\r
73 * @param seriesIndex the index of the series currently being drawn
\r
74 * @param startIndex the start index of the rendering points
\r
76 public void drawSeries(Canvas canvas, Paint paint, float[] points,
\r
77 SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) {
\r
78 int length = points.length;
\r
79 XYSeriesRenderer renderer = (XYSeriesRenderer) seriesRenderer;
\r
80 float lineWidth = paint.getStrokeWidth();
\r
81 paint.setStrokeWidth(renderer.getLineWidth());
\r
82 if (renderer.isFillBelowLine()) {
\r
83 paint.setColor(renderer.getFillBelowLineColor());
\r
84 int pLength = points.length;
\r
85 float[] fillPoints = new float[pLength + 4];
\r
86 System.arraycopy(points, 0, fillPoints, 0, length);
\r
87 fillPoints[0] = points[0] + 1;
\r
88 fillPoints[length] = fillPoints[length - 2];
\r
89 fillPoints[length + 1] = yAxisValue;
\r
90 fillPoints[length + 2] = fillPoints[0];
\r
91 fillPoints[length + 3] = fillPoints[length + 1];
\r
92 for (int i = 0; i < length + 4; i += 2) {
\r
93 if (fillPoints[i + 1] < 0) {
\r
94 fillPoints[i + 1] = 0;
\r
97 paint.setStyle(Style.FILL);
\r
98 drawPath(canvas, fillPoints, paint, true);
\r
100 paint.setColor(seriesRenderer.getColor());
\r
101 paint.setStyle(Style.STROKE);
\r
102 drawPath(canvas, points, paint, false);
\r
103 paint.setStrokeWidth(lineWidth);
\r
107 protected ClickableArea[] clickableAreasForPoints(float[] points, double[] values,
\r
108 float yAxisValue, int seriesIndex, int startIndex) {
\r
109 int length = points.length;
\r
110 ClickableArea[] ret = new ClickableArea[length / 2];
\r
111 for (int i = 0; i < length; i += 2) {
\r
112 int selectableBuffer = mRenderer.getSelectableBuffer();
\r
113 ret[i / 2] = new ClickableArea(new RectF(points[i] - selectableBuffer, points[i + 1]
\r
114 - selectableBuffer, points[i] + selectableBuffer, points[i + 1] + selectableBuffer),
\r
115 values[i], values[i + 1]);
\r
121 * Returns the legend shape width.
\r
123 * @param seriesIndex the series index
\r
124 * @return the legend shape width
\r
126 public int getLegendShapeWidth(int seriesIndex) {
\r
127 return SHAPE_WIDTH;
\r
131 * The graphical representation of the legend shape.
\r
133 * @param canvas the canvas to paint to
\r
134 * @param renderer the series renderer
\r
135 * @param x the x value of the point the shape should be drawn at
\r
136 * @param y the y value of the point the shape should be drawn at
\r
137 * @param seriesIndex the series index
\r
138 * @param paint the paint to be used for drawing
\r
140 public void drawLegendShape(Canvas canvas, SimpleSeriesRenderer renderer, float x, float y,
\r
141 int seriesIndex, Paint paint) {
\r
142 canvas.drawLine(x, y, x + SHAPE_WIDTH, y, paint);
\r
143 if (isRenderPoints(renderer)) {
\r
144 pointsChart.drawLegendShape(canvas, renderer, x + 5, y, seriesIndex, paint);
\r
149 * Returns if the chart should display the points as a certain shape.
\r
151 * @param renderer the series renderer
\r
153 public boolean isRenderPoints(SimpleSeriesRenderer renderer) {
\r
154 return ((XYSeriesRenderer) renderer).getPointStyle() != PointStyle.POINT;
\r
158 * Returns the scatter chart to be used for drawing the data points.
\r
160 * @return the data points scatter chart
\r
162 public ScatterChart getPointsChart() {
\r
163 return pointsChart;
\r
167 * Returns the chart type identifier.
\r
169 * @return the chart type
\r
171 public String getChartType() {
\r