Bar chart using achartengine

亡梦爱人 提交于 2019-11-28 05:06:41

Can be achieved by extending the SimpleSeriesRenderer and BarChart classes. Here is my solution for RangeBarChart (all thanks to gilenodm, wish I had some reputation to upvote your answer):

import org.achartengine.renderer.SimpleSeriesRenderer;
public class AdvancedSeriesRenderer extends SimpleSeriesRenderer
{
    private int []  colors;

    public void AdvancedSeriesRenderer ()
    {
    }

    public int getColor ( int position )
    {
        return colors[position];
    }
}

import org.achartengine.chart.RangeBarChart;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;

public class AdvancedRangeBarChart extends RangeBarChart
{
    private int []  barChartColors;

    public AdvancedRangeBarChart ( XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, Type type )
    {
        super ( dataset, renderer, type );
    }

    public void setColors ( int [] colorsIn )
    {
        barChartColors = colorsIn;
    }

    @Override
    public void drawSeries ( Canvas canvas, Paint paint, float [] points, SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex )
    {
        int seriesNr = mDataset.getSeriesCount ();
        int length = points.length;
        paint.setStyle ( Style.FILL );
        float halfDiffX = getHalfDiffX ( points, length, seriesNr );
        int start = 0;
        if ( startIndex > 0 )
        {
            start = 2;
        }
        for ( int i = start; i < length; i += 4 )
        {
            int colorIndex = (int) ( i / 4 ) % barChartColors.length;
            paint.setColor ( barChartColors[colorIndex] );
            if ( points.length > i + 3 )
            {
                float xMin = points[i];
                float yMin = points[i + 1];
                // xMin = xMax
                float xMax = points[i + 2];
                float yMax = points[i + 3];
                drawBar ( canvas, xMin, yMin, xMax, yMax, halfDiffX, seriesNr, seriesIndex, paint );
            }
        }
    }
}
gilenodm

I made a hack to achieve this effect. Org.achartengine.SimpleSeriesRenderer changed the class, I added an int[] colors and a boolean multipleColorsEnabled with its getters and setters. So, I changed, org.achartengine.BarChart in class, the method drawSeries, where is set the color of each bar in a loop, as follows:

int j = startIndex;
for (int i = 0; i < length; i += 2) {
    if (seriesRenderer.isMultipleColorsEnabled()) {
        paint.setColor(seriesRenderer.getColors()[j++]);
    } else {
        paint.setColor(seriesRenderer.getColor());
    }
    float x = points[i];
    float y = points[i + 1];
    drawBar(canvas, x, yAxisValue, x, y, halfDiffX, seriesNr,
        seriesIndex, paint);
}

In the class that loads the data used:

seriesRenderer.setMultipleColorsEnabled(true);
seriesRenderer.setColors(myColors);

It's been a while since I use achartengine, but I think each series has to have its own colour. As a workaround, you could make the bar that you want to differentiate a member of its own series, and set a different colour for that series. Perhaps someone else has a better way though.

You have to use different SimpleSeriesRenderer inside buildBarRenderer() call, and define as many serie as the desired number of colors, this way (replacing your first two lines of code):

values.add(new double[] {21});  
values.add(new double[] {56});  
values.add(new double[] {33});  
//ETC.
int[] colors = new int[] { Color.rgb(227, 121, 15),
                           Color.rgb(227, 121, 227), 
                           Color.rgb(127, 121, 127) };

The rest of code should be same as yours, but I haven't tested it. AFAIK you need different series, because every serie can only have one color.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!