Achartengine BarChart使用BasicStroke添加实体轮廓

时间:2013-04-21 22:48:33

标签: android achartengine

我正在使用Achartengine生成条形图,我想要改进它们的外观。我想为每个显示的栏添加笔画(轮廓?)。

有没有办法将BasicStroke用于XYMultipleSeriesRenderer?

这是我想要实现的,基于我所拥有的(我有一个XYMultipleSeriesRenderer,我想要添加一个笔划):

screenshot example

我试图用BasicStroke.class方法扩展XYMultipleSeriesRenderer,看看我是否可以在XYMultipleSeriesRenderer上使用setStroke(只是一个实验,所以不要跳我)。没想到它会起作用,但我提供的代码让你可以更好地理解我的想法。

最好,我想重用Achartengine的代码,而不必修改.jar文件。如果有一种方法,我可以扩展其中一个类...它将节省生命/时间。

package com.example.android.fragments_proto.aChartEngine;

import java.util.ArrayList;
import java.util.List;

import org.achartengine.chart.PointStyle;
import org.achartengine.renderer.BasicStroke;
import org.achartengine.renderer.XYMultipleSeriesRenderer;

import android.graphics.Color;


public class BarChartStyling extends XYMultipleSeriesRenderer {

    /** The stroke style. */
      private BasicStroke mStroke;

      /**
       * Returns the stroke style.
       * 
       * @return the stroke style
       */
      public BasicStroke getStroke() {
        return mStroke;
      }

      /**
       * Sets the stroke style.
       * 
       * @param stroke the stroke style
       */
      public void setStroke(BasicStroke stroke) {
        mStroke = stroke;
      }






虽然有更优雅的方法来实现这一点,但我在BarChart.class中找到了一个快捷方式。它涉及编辑源代码,但它是一个不错的解决方案。

当我有时间并将其提交给回购时,我会对此进行润色。在GoogleCode上。

丹,如果你对使用这种方法有任何意见或警告......请尽量批评。

  private void drawBar(Canvas canvas, float xMin, float yMin, float xMax, float yMax, int scale,
      int seriesIndex, Paint paint) {
    SimpleSeriesRenderer renderer = mRenderer.getSeriesRendererAt(seriesIndex);

    // set the color to the first drawRect 
    // using the paint param.
    paint.setColor(Color.BLACK);

    // use the first drawRect to draw a bar 
    // with (left, top, right, bottom, paint)
    canvas.drawRect(Math.round(xMin), Math.round(yMin), Math.round(xMax), Math.round(yMax), paint);
    if (renderer.isGradientEnabled()) {
      float minY = (float) toScreenPoint(new double[] { 0, renderer.getGradientStopValue() }, scale)[1];
      float maxY = (float) toScreenPoint(new double[] { 0, renderer.getGradientStartValue() },
          scale)[1];
      float gradientMinY = Math.max(minY, Math.min(yMin, yMax));
      float gradientMaxY = Math.min(maxY, Math.max(yMin, yMax));
      int gradientMinColor = renderer.getGradientStopColor();
      int gradientMaxColor = renderer.getGradientStartColor();
      int gradientStartColor = gradientMaxColor;
      int gradientStopColor = gradientMinColor;

      if (yMin < minY) {
        paint.setColor(gradientMinColor);
        canvas.drawRect(Math.round(xMin), Math.round(yMin), Math.round(xMax),
            Math.round(gradientMinY), paint);
      } else {
        gradientStopColor = getGradientPartialColor(gradientMinColor, gradientMaxColor,
            (maxY - gradientMinY) / (maxY - minY));
      }
      if (yMax > maxY) {
        paint.setColor(gradientMaxColor);
        canvas.drawRect(Math.round(xMin), Math.round(gradientMaxY), Math.round(xMax),
            Math.round(yMax), paint);
      } else {
        gradientStartColor = getGradientPartialColor(gradientMaxColor, gradientMinColor,
            (gradientMaxY - minY) / (maxY - minY));
      }
      GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[] {
          gradientStartColor, gradientStopColor });
      gradient.setBounds(Math.round(xMin), Math.round(gradientMinY), Math.round(xMax),
          Math.round(gradientMaxY));
      gradient.draw(canvas);
    } else {
      if (Math.abs(yMin - yMax) < 1) {
        if (yMin < yMax) {
          yMax = yMin + 1;
        } else {
          yMax = yMin - 1;
        }
      }

      // set the color to the second drawRect 
      // using the paint param.
      paint.setColor(renderer.getColor());

      // modify the drawRect size and position to create a 
      // smaller bar above the first one 
      // while modifying it's size proportionally 
      // (left + 5, top + 5, right - 5, bottom - 5, paint)
      canvas.drawRect(Math.round(xMin + 5), Math.round(yMin + 5), Math.round(xMax - 5), Math.round(yMax - 5), paint); 
    }
  }

1 个答案:

答案 0 :(得分:1)

我认为它并不像扩展渲染器类那么简单。您还必须扩展实际在条形图中呈现条形的BarChart类。我建议您查看源代码并在那里添加您的功能。然后,如果您希望其他人从您的更改中受益,请随时通过创建问题并附加代码补丁将其贡献给AChartEngine社区。