Android 使用BasicStroke添加实心轮廓的阿卡廷柱状图

Android 使用BasicStroke添加实心轮廓的阿卡廷柱状图,android,achartengine,Android,Achartengine,我正在使用Achartengine生成条形图,我想改进它们的外观。我想为显示的每个条添加笔划(轮廓?) 有没有一种方法可以将BasicStroke用于XYMultipleSeriesRender 这就是我试图实现的目标,基于我所拥有的(我有一个XYMultipleSeriesRenderer,我想添加一个笔划): 我尝试用BasicStroke.class方法扩展XYMultipleSeriesRender,看看是否可以在XYMultipleSeriesRender上使用setStroke(只

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

有没有一种方法可以将BasicStroke用于XYMultipleSeriesRender

这就是我试图实现的目标,基于我所拥有的(我有一个XYMultipleSeriesRenderer,我想添加一个笔划):

我尝试用BasicStroke.class方法扩展XYMultipleSeriesRender,看看是否可以在XYMultipleSeriesRender上使用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中找到了一个快捷方式。它涉及到编辑源代码,但这是一个不错的解决方案

当我有时间的时候,我会把它擦亮并提交给回购协议。谷歌代码

丹,如果你在使用这个方法时有任何意见或警告。。。请不要沉溺于批评

  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); 
    }
  }
private void牵引杆(画布、浮动xMin、浮动yMin、浮动xMax、浮动yMax、整数比例、,
int系列索引、油漆){
SimpleSeriesRenderer渲染器=mrender.GetSeriesRenderRat(seriesIndex);
//将颜色设置为第一个drawRect
//使用绘制参数。
油漆。设置颜色(颜色。黑色);
//使用第一个drawRect绘制条形图
//带(左、上、右、下、油漆)
drawRect(Math.round(xMin)、Math.round(yMin)、Math.round(xMax)、Math.round(yMax)、paint);
if(renderer.isGradientEnabled()){
float minY=(float)到screenpoint(新的double[]{0,renderer.getGradientStopValue()},scale)[1];
float maxY=(float)到screenpoint(新的double[]{0,renderer.getGradientStartValue()},
比例[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(yMinmaxY){
paint.setColor(gradientMaxColor);
canvas.drawRect(Math.round(xMin)、Math.round(gradientMaxY)、Math.round(xMax),
数学圆(yMax),油漆);
}否则{
gradientStartColor=getGradientPartialColor(gradientMaxColor,gradientMinColor,
(gradientMaxY-minY)/(maxY-minY));
}
GradientDrawable渐变=新的GradientDrawable(Orientation.BOTTOM\u TOP,new int[]{
gradientStartColor,gradientStopColor});
gradient.setBounds(Math.round(xMin)、Math.round(gradientMinY)、Math.round(xMax),
数学圆(gradientMaxY);
渐变。绘制(画布);
}否则{
if(数学绝对值(yMin-yMax)<1){
if(yMin
我认为这不仅仅是扩展renderer类那么简单。您还必须扩展在条形图中实际呈现条形图的
条形图
类。我宁愿建议您签出源代码并在那里添加您的特性。然后,如果您希望其他人从您的更改中受益,可以通过创建问题并附加代码补丁,将其贡献回AChartEngine社区。

如果您添加您已经完成的工作的快照以及您需要在该工作中进行的更改,则会更加清晰。。。正如我所说:我的XYMultiplesseries中的stroke也介绍了一些试用代码,谢谢你的时间,Dan。我给我的问题添加了一个“快速而肮脏”的解决方案。当我有时间的时候,我会很高兴地将它磨光成一个更优雅的方法,并将其提交到Google代码中。