我正在使用 GraphView libary在我正在构建的Android应用程序中绘制图形。
图表使用x轴的日期。但是,使用DateFormat
不允许我在水平标签上显示换行符。这样做可以让我一次在屏幕上获得更多的点数和标签。
图表当前的外观如下:
这就是我希望图表上的标签出现的方式:
我这样做是通过从 SQLite 数据库中提取日期来实现的。然后我将它们转换为字符串并将它们存储在一个数组中。然后将字符串格式化为包含新行的SimpleDateFormat
。我已经多次调试了这一点,很明显数组中的每个String都包含这一新行。但是,当将水平标签设置为此字符串数组时,它在第一张图像中的显示效果与我喜欢的不同。
我的代码:
List<String> dates = new ArrayList<String>();
//getting the date Strings from the Sqlite Database
try {
dates = db.getTimeDate();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Creates the line break to add into string
String newline = System.getProperty("line.separator");
//Create date format that contains the line break
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"+newline+"HH:mm:ss");
//Iterate through arraylist formatting the string to new date format that contains linebreak
for (int i = 0; i > dates.size(); i++) {
String datad = dateFormat.format(dates.get(i));
dates.set(i, datad);
}
final String[] _date = dates.toArray(new String[dates.size()]);
// make graphdata
List<GraphViewData> graphdata = new ArrayList<GraphViewData>();
for (int i = 0; i < dates.size(); i++) {
graphdata.add(new GraphViewData(i, _time[i]));
}
GraphViewData[] _graphdata = graphdata
.toArray(new GraphViewData[graphdata.size()]);
GraphViewSeries exampleSeries = new GraphViewSeries("", new GraphViewSeriesStyle(
getResources().getColor(R.color.mathleteRed), 2), _graphdata);
GraphView graphView = new LineGraphView(this, "");
graphView.setLayoutParams(new LayoutParams(320, 200));
graphView.addSeries(exampleSeries); // data
graphView.getGraphViewStyle().setTextSize(
getResources().getDimension((R.dimen.graph_text_size)));
graphView.getGraphViewStyle().setNumHorizontalLabels(5);
graphView.setScrollable(true);
graphView.setShowHorizontalLabels(true);
((LineGraphView) graphView).setDrawDataPoints(true);
((LineGraphView) graphView).setDataPointsRadius(4);
graphView.setCustomLabelFormatter(new CustomLabelFormatter() {
public String formatLabel(double value, boolean isValueX) {
if (isValueX) {
// Assuming only 7 total values here
return _date[(int) value];
} else
return String.format("%.2f", value);
}
});
graphView.setViewPort(0, 4);
graphView.getGraphViewStyle().setHorizontalLabelsColor(
getResources().getColor(R.color.white));
任何帮助都会很棒。我知道问题不在于 SQLite 数据库,因为我已经多次调试和测试了它。
答案 0 :(得分:0)
在 GraphView.java 类中,方法 drawHorizontalLabels 是必须添加代码才能换行的地方。我添加了另一种方法,只有在水平标签采用日期格式时才会换行,这样就不会破坏任何不是日期的标签。
protected void drawHorizontalLabels(Canvas canvas, float border,
float horstart, float height, String[] horlabels, float graphwidth) {
// horizontal labels + lines
int hors = horlabels.length - 1;
for (int i = 0; i < horlabels.length; i++) {
paint.setColor(graphViewStyle.getGridColor());
float x = ((graphwidth / hors) * i) + horstart;
if (graphViewStyle.getGridStyle() != GridStyle.VERTICAL) {
canvas.drawLine(x, height - border, x, border, paint);
}
if (showHorizontalLabels) {
paint.setTextAlign(Align.CENTER);
if (i == horlabels.length - 1)
paint.setTextAlign(Align.RIGHT);
if (i == 0)
paint.setTextAlign(Align.LEFT);
paint.setColor(graphViewStyle.getHorizontalLabelsColor());
//this is where I have added code.
if (HorDates == true) {
String[] Text = horlabels[i].split("\\s");
canvas.drawText(Text[1], x, height - 25, paint);
canvas.drawText(Text[0], x, height - 15, paint);
} else {
canvas.drawText(horlabels[i], x, height - 25, paint);
}
}
}
}
但是,只有在日期和时间之间用空格格式化日期时才会这样: 11/12/14 01:21:40
这样代码会将标签文本拆分为空格中的两个字符串,然后将它们分开绘制在另一个下面。
还有一个简单的设置HorDates方法:
public void isHorLabDates(boolean _HorDates) {
this.HorDates = _HorDates;
}
水平标签现在在画布中打印如下:
<强> 11/12/14 强>
<强> 1时21分40秒强>
答案 1 :(得分:0)
由于@appsthatmatter(jjoe64)和@LDSDev,现在可以使用"\n"
中的DateFormat
。
您甚至可以像Use dates as labels示例中那样使用DateAsXAxisLabelFormatter
:
graph.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(
getActivity(), new SimpleDateFormat("dd/MM/yy"+"\n"+"HH:mm:ss")));
通过 GraphView 4.2.2 测试。
或者,我建议您尝试使用下一个选项,以一定的倾斜角度显示标签。在某些情况下,它允许以更紧凑,更优雅的方式显示标签:
graph.getGridLabelRenderer().setHorizontalLabelsAngle(135)