我正在使用GraphView库(请参阅:https://github.com/jjoe64/GraphView或http://www.jjoe64.com/p/graphview-library.html)
但我想将日期/时间用于X-as。有谁知道一个简单的方法来完成这个或任何人都可以推动我朝着正确的方向?
答案 0 :(得分:11)
这是执行此操作的正确方法
您只需使用unix时间戳(从1.01.1970开始的秒数)作为x值。
然后,您可以设置自定义标签格式化程序并将unix时间戳转换为字符串:
final java.text.DateFormat dateTimeFormatter = DateFormat.getTimeFormat(mActivity);
LineGraphView graphView = new LineGraphView(mActivity, entry.getValue()) {
@Override
protected String formatLabel(double value, boolean isValueX) {
if (isValueX) {
// transform number to time
return dateTimeFormatter.format(new Date((long) value*1000));
} else {
return super.formatLabel(value, isValueX);
}
}
};
答案 1 :(得分:2)
GraphView是一个很棒的库,我发现它也是最简单的。这样做的第一步是在GraphView.java中的GraphViewData类中添加一个String变量。像所以:
static public class GraphViewData {
public final double valueX;
public final double valueY;
public final String valueDate;
public GraphViewData(double valueX, double valueY,String valueDate) {
super();
this.valueX = valueX;
this.valueY = valueY;
this.valueDate = valueDate;
}
}
在创建GraphView图形时创建GraphViewData对象时,需要以字符串形式(以及X和Y)添加日期数据。
假设您的图表中有80个数据点(索引0 - 79)。 GraphView中有一个方法负责生成和返回水平标签,我相信它叫做 generateHorLabels 。而不是只返回X值(0-79),使用X值从GraphData对象中获取String。
在您现在的代码中,它应该在 for 循环中具有以下内容
labels[i] = formatLabel(min + ((max-min)*i/numLabels), true);
而不是上述内容,你可以做这样的事情。
Double temp = Double.valueOf(formatLabel(min + ((max-min)*i/numLabels), true));
int rounded =(int)Math.round(temp);
labels[i] = values[rounded].valueDate;
希望这有帮助!
答案 2 :(得分:1)
这里是来自jjoe64的更新答案,其中x值来自Date#getTime()
final DateFormat dateTimeFormatter = DateFormat.getDateTimeInstance();
graphView = new LineGraphView(context, "Chart");
graphView.setCustomLabelFormatter(new CustomLabelFormatter()
{
@Override
public String formatLabel(double value, boolean isValueX)
{
if (isValueX)
{
return dateTimeFormatter.format(new Date((long) value));
}
return null; // let graphview generate Y-axis label for us
}
});
答案 3 :(得分:0)
我在设置值的同时创建了水平标签:
public void initializeLineGraphView() {
// Get last weeks entries from the DB
ArrayList<Entry> entries = DbManager.getInstance().getLastWeeksEntries(new Date());
String[] hLabels = new String[entries.size()];
GraphView.GraphViewData[] graphViewData = new GraphView.GraphViewData[entries.size()];
for(int i = 0; i < entries.size(); i++) {
Entry entry = entries.get(i);
int pain = entry.getPain();
graphViewData[i] = new GraphView.GraphViewData(i, pain);
// Generate the horizontal labels
SimpleDateFormat sdf = new SimpleDateFormat("EEE");
String dayOfWeek = sdf.format(entry.getDate());
hLabels[i] = dayOfWeek;
}
mSeries = new GraphViewSeries("", null, graphViewData);
GraphView graphView = new LineGraphView(getActivity(), "");
graphView.addSeries(mSeries);
graphView.setHorizontalLabels(hLabels);
graphView.setVerticalLabels(new String[] {"10", "5", "0"});
mLineGraphView = graphView;
}