【问题标题】:Using dates with the Graphview library在 Graphview 库中使用日期
【发布时间】:2012-05-24 02:24:56
【问题描述】:

我正在使用 GraphView 库(请参阅:https://github.com/jjoe64/GraphViewhttp://www.jjoe64.com/p/graphview-library.html

但我想为 X-as 使用日期/时间。有谁知道实现此目的的简单方法,或者任何人都可以将我推向正确的方向吗?

【问题讨论】:

    标签: android datetime charts android-graphview


    【解决方案1】:

    我在设置值的同时创建了水平标签:

    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;
    
    }
    

    【讨论】:

      【解决方案2】:

      这是来自 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】:

        这是正确的做法

        您只需使用 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);
                }
            }
        };
        

        【讨论】:

        • 嗨@jjoe64,你的图书馆做得很好。我正在尝试将它与日期作为 x 轴作为这个问题的 OP,但我有一个不同的问题。如果 x 值的序列不是线性的,我会得到 graphview 将序列边界之间的值放在错误的位置。这是,对于 {1, 3, 4},它把 1 和 4,但不是 3。我想我必须填充所有缺失的值(或给出使序列线性的那些),但在我看来有点难看解决方案。有没有其他我不知道的方法可以用你的图书馆做到这一点?谢谢!
        • 嗨。 graphview 不关心您的数据序列。它只是在该标签的位置生成标签。没有办法影响标签的位置。你也许可以为你的特殊情况做一个解决方法,看看静态标签,或者 GraphViewStyle#setNumHorizo​​ntalLabels
        • @jjoe64 我是 Android 新手,所以我现在有点困惑,我正在尝试使用您提供的代码,但我不明白,entry.getValue() 是什么? dl.dropboxusercontent.com/u/6151466/graphview.jpg 这是我的情况。你能帮我解决这个问题吗?谢谢
        【解决方案4】:

        GraphView 是一个很棒的库,我发现它也是最简单的。这样做的第一步是在 GraphView.java 的 GraphViewData 类中添加一个字符串变量。像这样:

        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 对象中获取字符串。

        在您现在拥有的代码中,它应该在 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;
        

        希望这有帮助!

        【讨论】:

        • 谢谢你的回答..我今天会试试这个,看看我今天能不能完成。完成后我可能会接受答案
        • 您可以使用许多自定义内容,例如单击点和界面时的弹出窗口:)
        • values[rounded].valueDate; 应该是什么?该库无法识别 values 对象
        • 我使用了 labels[i] = graphSeries.get(0).values[i].getDate();
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多