我正在使用Achartengine生成条形图,我想要改进它们的外观。我想为每个显示的栏添加笔画(轮廓?)。
有没有办法将BasicStroke用于XYMultipleSeriesRenderer?
这是我想要实现的,基于我所拥有的(我有一个XYMultipleSeriesRenderer,我想要添加一个笔划):
我试图用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);
}
}
答案 0 :(得分:1)
我认为它并不像扩展渲染器类那么简单。您还必须扩展实际在条形图中呈现条形的BarChart
类。我建议您查看源代码并在那里添加您的功能。然后,如果您希望其他人从您的更改中受益,请随时通过创建问题并附加代码补丁将其贡献给AChartEngine社区。 p>